From 38458ee368f69e8a00b4f97146773248b54b6f7e Mon Sep 17 00:00:00 2001 From: Ekansh Jindal <138109582+ekxnsh22005@users.noreply.github.com> Date: Thu, 23 Oct 2025 12:56:15 +0530 Subject: [PATCH] Add: FullStack QuizMaster --- Domains/FullStack/MiniProjects/.DS_Store | Bin 0 -> 6148 bytes .../MiniProjects/QuizMaster/.DS_Store | Bin 0 -> 8196 bytes .../MiniProjects/QuizMaster/Procfile | 1 + .../MiniProjects/QuizMaster/README.md | 23 + .../__pycache__/app.cpython-312.pyc | Bin 0 -> 558 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 8200 bytes .../FullStack/MiniProjects/QuizMaster/app.py | 14 + .../QuizMaster/controller/.DS_Store | Bin 0 -> 6148 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 3628 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 629 bytes .../__pycache__/routes.cpython-312.pyc | Bin 0 -> 56722 bytes .../MiniProjects/QuizMaster/controller/api.py | 61 + .../QuizMaster/controller/config.py | 7 + .../QuizMaster/controller/routes.py | 923 ++ .../QuizMaster/instance/db.sqlite3 | Bin 0 -> 45056 bytes .../MiniProjects/QuizMaster/models.py | 86 + .../MiniProjects/QuizMaster/requirements.txt | 18 + .../MiniProjects/QuizMaster/run_app.py | 23 + .../swagger_subject_chapter_api.yaml | 112 + .../QuizMaster/templates/admin.html | 82 + .../QuizMaster/templates/chapter/add.html | 39 + .../QuizMaster/templates/chapter/delete.html | 41 + .../QuizMaster/templates/chapter/edit.html | 37 + .../QuizMaster/templates/index.html | 134 + .../QuizMaster/templates/layout.html | 65 + .../QuizMaster/templates/login.html | 41 + .../QuizMaster/templates/messages.html | 17 + .../QuizMaster/templates/navbar.html | 38 + .../QuizMaster/templates/profile.html | 60 + .../QuizMaster/templates/question/add.html | 72 + .../QuizMaster/templates/question/delete.html | 72 + .../QuizMaster/templates/question/edit.html | 72 + .../QuizMaster/templates/quiz.html | 82 + .../QuizMaster/templates/quiz/add.html | 94 + .../QuizMaster/templates/quiz/delete.html | 67 + .../QuizMaster/templates/quiz/details.html | 64 + .../QuizMaster/templates/quiz/edit.html | 131 + .../QuizMaster/templates/quiz_user/start.html | 180 + .../QuizMaster/templates/quiz_user/view.html | 45 + .../QuizMaster/templates/register.html | 57 + .../templates/scores/quiz_details.html | 65 + .../QuizMaster/templates/scores/score.html | 47 + .../templates/search/search_results.html | 36 + .../templates/search/subject_details.html | 51 + .../templates/search/user_details.html | 89 + .../QuizMaster/templates/subject/add.html | 64 + .../QuizMaster/templates/subject/delete.html | 39 + .../QuizMaster/templates/subject/edit.html | 37 + .../templates/summary/admin_summary.html | 95 + .../templates/summary/user_summary.html | 92 + .../QuizMaster/venv/bin/Activate.ps1 | 247 + .../MiniProjects/QuizMaster/venv/bin/activate | 76 + .../QuizMaster/venv/bin/activate.csh | 27 + .../QuizMaster/venv/bin/activate.fish | 69 + .../MiniProjects/QuizMaster/venv/bin/dotenv | 8 + .../MiniProjects/QuizMaster/venv/bin/flask | 8 + .../MiniProjects/QuizMaster/venv/bin/gunicorn | 8 + .../MiniProjects/QuizMaster/venv/bin/pip | 8 + .../MiniProjects/QuizMaster/venv/bin/pip3 | 8 + .../MiniProjects/QuizMaster/venv/bin/pip3.12 | 8 + .../MiniProjects/QuizMaster/venv/bin/python | 1 + .../MiniProjects/QuizMaster/venv/bin/python3 | 1 + .../QuizMaster/venv/bin/python3.12 | 1 + .../Flask_RESTful-0.3.10.dist-info/AUTHORS.md | 132 + .../Flask_RESTful-0.3.10.dist-info/INSTALLER | 1 + .../Flask_RESTful-0.3.10.dist-info/LICENSE | 25 + .../Flask_RESTful-0.3.10.dist-info/METADATA | 29 + .../Flask_RESTful-0.3.10.dist-info/RECORD | 28 + .../Flask_RESTful-0.3.10.dist-info/REQUESTED | 0 .../Flask_RESTful-0.3.10.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../MarkupSafe-3.0.2.dist-info/INSTALLER | 1 + .../MarkupSafe-3.0.2.dist-info/LICENSE.txt | 28 + .../MarkupSafe-3.0.2.dist-info/METADATA | 92 + .../MarkupSafe-3.0.2.dist-info/RECORD | 15 + .../MarkupSafe-3.0.2.dist-info/REQUESTED | 0 .../MarkupSafe-3.0.2.dist-info/WHEEL | 5 + .../MarkupSafe-3.0.2.dist-info/top_level.txt | 1 + .../SQLAlchemy-2.0.37.dist-info/INSTALLER | 1 + .../SQLAlchemy-2.0.37.dist-info/LICENSE | 19 + .../SQLAlchemy-2.0.37.dist-info/METADATA | 243 + .../SQLAlchemy-2.0.37.dist-info/RECORD | 530 + .../SQLAlchemy-2.0.37.dist-info/REQUESTED | 0 .../SQLAlchemy-2.0.37.dist-info/WHEEL | 5 + .../SQLAlchemy-2.0.37.dist-info/top_level.txt | 1 + .../__pycache__/six.cpython-312.pyc | Bin 0 -> 41414 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 139477 bytes .../aniso8601-10.0.0.dist-info/INSTALLER | 1 + .../aniso8601-10.0.0.dist-info/LICENSE | 27 + .../aniso8601-10.0.0.dist-info/METADATA | 519 + .../aniso8601-10.0.0.dist-info/RECORD | 61 + .../aniso8601-10.0.0.dist-info/REQUESTED | 0 .../aniso8601-10.0.0.dist-info/WHEEL | 6 + .../aniso8601-10.0.0.dist-info/top_level.txt | 1 + .../site-packages/aniso8601/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 725 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 634 bytes .../__pycache__/date.cpython-312.pyc | Bin 0 -> 3476 bytes .../decimalfraction.cpython-312.pyc | Bin 0 -> 421 bytes .../__pycache__/duration.cpython-312.pyc | Bin 0 -> 8077 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2455 bytes .../__pycache__/interval.cpython-312.pyc | Bin 0 -> 8715 bytes .../__pycache__/resolution.cpython-312.pyc | Bin 0 -> 1543 bytes .../__pycache__/time.cpython-312.pyc | Bin 0 -> 4519 bytes .../__pycache__/timezone.cpython-312.pyc | Bin 0 -> 2045 bytes .../__pycache__/utcoffset.cpython-312.pyc | Bin 0 -> 2310 bytes .../aniso8601/builders/__init__.py | 614 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 17587 bytes .../__pycache__/python.cpython-312.pyc | Bin 0 -> 18968 bytes .../aniso8601/builders/python.py | 700 ++ .../aniso8601/builders/tests/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../__pycache__/test_init.cpython-312.pyc | Bin 0 -> 30992 bytes .../__pycache__/test_python.cpython-312.pyc | Bin 0 -> 48218 bytes .../aniso8601/builders/tests/test_init.py | 838 ++ .../aniso8601/builders/tests/test_python.py | 1723 ++++ .../site-packages/aniso8601/compat.py | 24 + .../site-packages/aniso8601/date.py | 164 + .../aniso8601/decimalfraction.py | 12 + .../site-packages/aniso8601/duration.py | 291 + .../site-packages/aniso8601/exceptions.py | 51 + .../site-packages/aniso8601/interval.py | 352 + .../site-packages/aniso8601/resolution.py | 27 + .../site-packages/aniso8601/tests/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 199 bytes .../tests/__pycache__/compat.cpython-312.pyc | Bin 0 -> 356 bytes .../__pycache__/test_compat.cpython-312.pyc | Bin 0 -> 1321 bytes .../__pycache__/test_date.cpython-312.pyc | Bin 0 -> 9085 bytes .../test_decimalfraction.cpython-312.pyc | Bin 0 -> 1037 bytes .../__pycache__/test_duration.cpython-312.pyc | Bin 0 -> 32870 bytes .../__pycache__/test_init.cpython-312.pyc | Bin 0 -> 2673 bytes .../__pycache__/test_interval.cpython-312.pyc | Bin 0 -> 47529 bytes .../__pycache__/test_time.cpython-312.pyc | Bin 0 -> 18607 bytes .../__pycache__/test_timezone.cpython-312.pyc | Bin 0 -> 5074 bytes .../test_utcoffset.cpython-312.pyc | Bin 0 -> 3152 bytes .../site-packages/aniso8601/tests/compat.py | 16 + .../aniso8601/tests/test_compat.py | 27 + .../aniso8601/tests/test_date.py | 315 + .../aniso8601/tests/test_decimalfraction.py | 19 + .../aniso8601/tests/test_duration.py | 1402 +++ .../aniso8601/tests/test_init.py | 49 + .../aniso8601/tests/test_interval.py | 1675 ++++ .../aniso8601/tests/test_time.py | 539 ++ .../aniso8601/tests/test_timezone.py | 123 + .../aniso8601/tests/test_utcoffset.py | 56 + .../site-packages/aniso8601/time.py | 203 + .../site-packages/aniso8601/timezone.py | 63 + .../site-packages/aniso8601/utcoffset.py | 71 + .../blinker-1.9.0.dist-info/INSTALLER | 1 + .../blinker-1.9.0.dist-info/LICENSE.txt | 20 + .../blinker-1.9.0.dist-info/METADATA | 60 + .../blinker-1.9.0.dist-info/RECORD | 13 + .../blinker-1.9.0.dist-info/REQUESTED | 0 .../blinker-1.9.0.dist-info/WHEEL | 4 + .../site-packages/blinker/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 503 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 0 -> 2730 bytes .../blinker/__pycache__/base.cpython-312.pyc | Bin 0 -> 22004 bytes .../site-packages/blinker/_utilities.py | 64 + .../python3.12/site-packages/blinker/base.py | 512 + .../python3.12/site-packages/blinker/py.typed | 0 .../click-8.1.8.dist-info/INSTALLER | 1 + .../click-8.1.8.dist-info/LICENSE.txt | 28 + .../click-8.1.8.dist-info/METADATA | 74 + .../click-8.1.8.dist-info/RECORD | 39 + .../click-8.1.8.dist-info/REQUESTED | 0 .../site-packages/click-8.1.8.dist-info/WHEEL | 4 + .../site-packages/click/__init__.py | 75 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2742 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 27456 bytes .../__pycache__/_termui_impl.cpython-312.pyc | Bin 0 -> 30642 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 0 -> 2454 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 0 -> 11990 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 0 -> 135962 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 24730 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 14888 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 0 -> 14137 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 0 -> 3121 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 0 -> 21513 bytes .../shell_completion.cpython-312.pyc | Bin 0 -> 22910 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 0 -> 32797 bytes .../click/__pycache__/testing.cpython-312.pyc | Bin 0 -> 24780 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 0 -> 49472 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 0 -> 26379 bytes .../python3.12/site-packages/click/_compat.py | 623 ++ .../site-packages/click/_termui_impl.py | 788 ++ .../site-packages/click/_textwrap.py | 49 + .../site-packages/click/_winconsole.py | 279 + .../python3.12/site-packages/click/core.py | 3047 ++++++ .../site-packages/click/decorators.py | 562 ++ .../site-packages/click/exceptions.py | 296 + .../site-packages/click/formatting.py | 301 + .../python3.12/site-packages/click/globals.py | 67 + .../python3.12/site-packages/click/parser.py | 531 + .../python3.12/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 603 ++ .../python3.12/site-packages/click/termui.py | 784 ++ .../python3.12/site-packages/click/testing.py | 483 + .../python3.12/site-packages/click/types.py | 1093 +++ .../python3.12/site-packages/click/utils.py | 624 ++ .../site-packages/dotenv/__init__.py | 49 + .../site-packages/dotenv/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1699 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 363 bytes .../dotenv/__pycache__/cli.cpython-312.pyc | Bin 0 -> 9733 bytes .../__pycache__/ipython.cpython-312.pyc | Bin 0 -> 1972 bytes .../dotenv/__pycache__/main.cpython-312.pyc | Bin 0 -> 16463 bytes .../dotenv/__pycache__/parser.cpython-312.pyc | Bin 0 -> 10005 bytes .../__pycache__/variables.cpython-312.pyc | Bin 0 -> 5036 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 215 bytes .../python3.12/site-packages/dotenv/cli.py | 199 + .../site-packages/dotenv/ipython.py | 39 + .../python3.12/site-packages/dotenv/main.py | 392 + .../python3.12/site-packages/dotenv/parser.py | 175 + .../python3.12/site-packages/dotenv/py.typed | 1 + .../site-packages/dotenv/variables.py | 86 + .../site-packages/dotenv/version.py | 1 + .../flask-3.1.0.dist-info/INSTALLER | 1 + .../flask-3.1.0.dist-info/LICENSE.txt | 28 + .../flask-3.1.0.dist-info/METADATA | 81 + .../flask-3.1.0.dist-info/RECORD | 58 + .../flask-3.1.0.dist-info/REQUESTED | 0 .../site-packages/flask-3.1.0.dist-info/WHEEL | 4 + .../flask-3.1.0.dist-info/entry_points.txt | 3 + .../site-packages/flask/__init__.py | 60 + .../site-packages/flask/__main__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2482 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 243 bytes .../flask/__pycache__/app.cpython-312.pyc | Bin 0 -> 62487 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 0 -> 5002 bytes .../flask/__pycache__/cli.cpython-312.pyc | Bin 0 -> 43405 bytes .../flask/__pycache__/config.cpython-312.pyc | Bin 0 -> 16254 bytes .../flask/__pycache__/ctx.cpython-312.pyc | Bin 0 -> 19840 bytes .../__pycache__/debughelpers.cpython-312.pyc | Bin 0 -> 9149 bytes .../flask/__pycache__/globals.cpython-312.pyc | Bin 0 -> 1867 bytes .../flask/__pycache__/helpers.cpython-312.pyc | Bin 0 -> 25447 bytes .../flask/__pycache__/logging.cpython-312.pyc | Bin 0 -> 3269 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 17135 bytes .../flask/__pycache__/signals.cpython-312.pyc | Bin 0 -> 1224 bytes .../__pycache__/templating.cpython-312.pyc | Bin 0 -> 9934 bytes .../flask/__pycache__/testing.cpython-312.pyc | Bin 0 -> 13599 bytes .../flask/__pycache__/typing.cpython-312.pyc | Bin 0 -> 3990 bytes .../flask/__pycache__/views.cpython-312.pyc | Bin 0 -> 7020 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 0 -> 10055 bytes .../lib/python3.12/site-packages/flask/app.py | 1536 +++ .../site-packages/flask/blueprints.py | 128 + .../lib/python3.12/site-packages/flask/cli.py | 1133 +++ .../python3.12/site-packages/flask/config.py | 367 + .../lib/python3.12/site-packages/flask/ctx.py | 449 + .../site-packages/flask/debughelpers.py | 178 + .../python3.12/site-packages/flask/globals.py | 51 + .../python3.12/site-packages/flask/helpers.py | 634 ++ .../site-packages/flask/json/__init__.py | 170 + .../json/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6695 bytes .../json/__pycache__/provider.cpython-312.pyc | Bin 0 -> 9262 bytes .../json/__pycache__/tag.cpython-312.pyc | Bin 0 -> 13957 bytes .../site-packages/flask/json/provider.py | 215 + .../site-packages/flask/json/tag.py | 327 + .../python3.12/site-packages/flask/logging.py | 79 + .../python3.12/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 + .../sansio/__pycache__/app.cpython-312.pyc | Bin 0 -> 33715 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 0 -> 31215 bytes .../__pycache__/scaffold.cpython-312.pyc | Bin 0 -> 30225 bytes .../site-packages/flask/sansio/app.py | 964 ++ .../site-packages/flask/sansio/blueprints.py | 632 ++ .../site-packages/flask/sansio/scaffold.py | 792 ++ .../site-packages/flask/sessions.py | 398 + .../python3.12/site-packages/flask/signals.py | 17 + .../site-packages/flask/templating.py | 219 + .../python3.12/site-packages/flask/testing.py | 297 + .../python3.12/site-packages/flask/typing.py | 90 + .../python3.12/site-packages/flask/views.py | 191 + .../site-packages/flask/wrappers.py | 257 + .../site-packages/flask_restful/__init__.py | 738 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 32979 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 229 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 18555 bytes .../__pycache__/inputs.cpython-312.pyc | Bin 0 -> 11679 bytes .../__pycache__/reqparse.cpython-312.pyc | Bin 0 -> 18032 bytes .../flask_restful/__version__.py | 3 + .../site-packages/flask_restful/fields.py | 414 + .../site-packages/flask_restful/inputs.py | 282 + .../flask_restful/representations/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 213 bytes .../__pycache__/json.cpython-312.pyc | Bin 0 -> 1146 bytes .../flask_restful/representations/json.py | 25 + .../site-packages/flask_restful/reqparse.py | 367 + .../flask_restful/utils/__init__.py | 35 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1252 bytes .../utils/__pycache__/cors.cpython-312.pyc | Bin 0 -> 3413 bytes .../utils/__pycache__/crypto.cpython-312.pyc | Bin 0 -> 2069 bytes .../site-packages/flask_restful/utils/cors.py | 54 + .../flask_restful/utils/crypto.py | 35 + .../INSTALLER | 1 + .../LICENSE.rst | 28 + .../flask_sqlalchemy-3.1.1.dist-info/METADATA | 109 + .../flask_sqlalchemy-3.1.1.dist-info/RECORD | 27 + .../REQUESTED | 0 .../flask_sqlalchemy-3.1.1.dist-info/WHEEL | 4 + .../flask_sqlalchemy/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1051 bytes .../__pycache__/cli.cpython-312.pyc | Bin 0 -> 1029 bytes .../__pycache__/extension.cpython-312.pyc | Bin 0 -> 39958 bytes .../__pycache__/model.cpython-312.pyc | Bin 0 -> 13380 bytes .../__pycache__/pagination.cpython-312.pyc | Bin 0 -> 14285 bytes .../__pycache__/query.cpython-312.pyc | Bin 0 -> 4520 bytes .../record_queries.cpython-312.pyc | Bin 0 -> 4849 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 4553 bytes .../__pycache__/table.cpython-312.pyc | Bin 0 -> 1844 bytes .../track_modifications.cpython-312.pyc | Bin 0 -> 3626 bytes .../site-packages/flask_sqlalchemy/cli.py | 16 + .../flask_sqlalchemy/extension.py | 1008 ++ .../site-packages/flask_sqlalchemy/model.py | 330 + .../flask_sqlalchemy/pagination.py | 364 + .../site-packages/flask_sqlalchemy/py.typed | 0 .../site-packages/flask_sqlalchemy/query.py | 105 + .../flask_sqlalchemy/record_queries.py | 117 + .../site-packages/flask_sqlalchemy/session.py | 111 + .../site-packages/flask_sqlalchemy/table.py | 39 + .../flask_sqlalchemy/track_modifications.py | 88 + .../gunicorn-23.0.0.dist-info/INSTALLER | 1 + .../gunicorn-23.0.0.dist-info/LICENSE | 23 + .../gunicorn-23.0.0.dist-info/METADATA | 130 + .../gunicorn-23.0.0.dist-info/RECORD | 77 + .../gunicorn-23.0.0.dist-info/REQUESTED | 0 .../gunicorn-23.0.0.dist-info/WHEEL | 5 + .../entry_points.txt | 5 + .../gunicorn-23.0.0.dist-info/top_level.txt | 1 + .../site-packages/gunicorn/__init__.py | 8 + .../site-packages/gunicorn/__main__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 455 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 336 bytes .../__pycache__/arbiter.cpython-312.pyc | Bin 0 -> 33405 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 89123 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 3154 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 1219 bytes .../__pycache__/glogging.cpython-312.pyc | Bin 0 -> 22078 bytes .../__pycache__/pidfile.cpython-312.pyc | Bin 0 -> 4252 bytes .../__pycache__/reloader.cpython-312.pyc | Bin 0 -> 6392 bytes .../gunicorn/__pycache__/sock.cpython-312.pyc | Bin 0 -> 11966 bytes .../__pycache__/systemd.cpython-312.pyc | Bin 0 -> 3530 bytes .../gunicorn/__pycache__/util.cpython-312.pyc | Bin 0 -> 23849 bytes .../site-packages/gunicorn/app/__init__.py | 3 + .../app/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 196 bytes .../app/__pycache__/base.cpython-312.pyc | Bin 0 -> 11773 bytes .../app/__pycache__/pasterapp.cpython-312.pyc | Bin 0 -> 3085 bytes .../app/__pycache__/wsgiapp.cpython-312.pyc | Bin 0 -> 3369 bytes .../site-packages/gunicorn/app/base.py | 235 + .../site-packages/gunicorn/app/pasterapp.py | 74 + .../site-packages/gunicorn/app/wsgiapp.py | 70 + .../site-packages/gunicorn/arbiter.py | 671 ++ .../site-packages/gunicorn/config.py | 2442 +++++ .../site-packages/gunicorn/debug.py | 68 + .../site-packages/gunicorn/errors.py | 28 + .../site-packages/gunicorn/glogging.py | 473 + .../site-packages/gunicorn/http/__init__.py | 8 + .../http/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 371 bytes .../http/__pycache__/body.cpython-312.pyc | Bin 0 -> 12422 bytes .../http/__pycache__/errors.cpython-312.pyc | Bin 0 -> 8155 bytes .../http/__pycache__/message.cpython-312.pyc | Bin 0 -> 17693 bytes .../http/__pycache__/parser.cpython-312.pyc | Bin 0 -> 2156 bytes .../http/__pycache__/unreader.cpython-312.pyc | Bin 0 -> 3920 bytes .../http/__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 15728 bytes .../site-packages/gunicorn/http/body.py | 268 + .../site-packages/gunicorn/http/errors.py | 145 + .../site-packages/gunicorn/http/message.py | 463 + .../site-packages/gunicorn/http/parser.py | 51 + .../site-packages/gunicorn/http/unreader.py | 78 + .../site-packages/gunicorn/http/wsgi.py | 401 + .../gunicorn/instrument/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../__pycache__/statsd.cpython-312.pyc | Bin 0 -> 7262 bytes .../gunicorn/instrument/statsd.py | 134 + .../site-packages/gunicorn/pidfile.py | 85 + .../site-packages/gunicorn/reloader.py | 131 + .../python3.12/site-packages/gunicorn/sock.py | 231 + .../site-packages/gunicorn/systemd.py | 75 + .../python3.12/site-packages/gunicorn/util.py | 653 ++ .../gunicorn/workers/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 580 bytes .../workers/__pycache__/base.cpython-312.pyc | Bin 0 -> 13826 bytes .../__pycache__/base_async.cpython-312.pyc | Bin 0 -> 8515 bytes .../__pycache__/geventlet.cpython-312.pyc | Bin 0 -> 8192 bytes .../__pycache__/ggevent.cpython-312.pyc | Bin 0 -> 9457 bytes .../__pycache__/gthread.cpython-312.pyc | Bin 0 -> 18994 bytes .../__pycache__/gtornado.cpython-312.pyc | Bin 0 -> 8041 bytes .../workers/__pycache__/sync.cpython-312.pyc | Bin 0 -> 10679 bytes .../__pycache__/workertmp.cpython-312.pyc | Bin 0 -> 2949 bytes .../site-packages/gunicorn/workers/base.py | 287 + .../gunicorn/workers/base_async.py | 147 + .../gunicorn/workers/geventlet.py | 186 + .../site-packages/gunicorn/workers/ggevent.py | 193 + .../site-packages/gunicorn/workers/gthread.py | 372 + .../gunicorn/workers/gtornado.py | 166 + .../site-packages/gunicorn/workers/sync.py | 209 + .../gunicorn/workers/workertmp.py | 53 + .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 + .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 + .../itsdangerous-2.2.0.dist-info/METADATA | 60 + .../itsdangerous-2.2.0.dist-info/RECORD | 23 + .../itsdangerous-2.2.0.dist-info/REQUESTED | 0 .../itsdangerous-2.2.0.dist-info/WHEEL | 4 + .../site-packages/itsdangerous/__init__.py | 38 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1634 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 1188 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2688 bytes .../__pycache__/exc.cpython-312.pyc | Bin 0 -> 3948 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 0 -> 15429 bytes .../__pycache__/signer.cpython-312.pyc | Bin 0 -> 11294 bytes .../__pycache__/timed.cpython-312.pyc | Bin 0 -> 8742 bytes .../__pycache__/url_safe.cpython-312.pyc | Bin 0 -> 3538 bytes .../site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 106 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 + .../site-packages/itsdangerous/signer.py | 266 + .../site-packages/itsdangerous/timed.py | 228 + .../site-packages/itsdangerous/url_safe.py | 83 + .../jinja2-3.1.5.dist-info/INSTALLER | 1 + .../jinja2-3.1.5.dist-info/LICENSE.txt | 28 + .../jinja2-3.1.5.dist-info/METADATA | 75 + .../jinja2-3.1.5.dist-info/RECORD | 58 + .../jinja2-3.1.5.dist-info/REQUESTED | 0 .../jinja2-3.1.5.dist-info/WHEEL | 4 + .../jinja2-3.1.5.dist-info/entry_points.txt | 3 + .../site-packages/jinja2/__init__.py | 38 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1659 bytes .../__pycache__/_identifier.cpython-312.pyc | Bin 0 -> 2140 bytes .../__pycache__/async_utils.cpython-312.pyc | Bin 0 -> 4980 bytes .../__pycache__/bccache.cpython-312.pyc | Bin 0 -> 19351 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 0 -> 104064 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 1562 bytes .../jinja2/__pycache__/debug.cpython-312.pyc | Bin 0 -> 6587 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 0 -> 1612 bytes .../__pycache__/environment.cpython-312.pyc | Bin 0 -> 76664 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7726 bytes .../jinja2/__pycache__/ext.cpython-312.pyc | Bin 0 -> 41919 bytes .../__pycache__/filters.cpython-312.pyc | Bin 0 -> 72559 bytes .../__pycache__/idtracking.cpython-312.pyc | Bin 0 -> 19198 bytes .../jinja2/__pycache__/lexer.cpython-312.pyc | Bin 0 -> 32076 bytes .../__pycache__/loaders.cpython-312.pyc | Bin 0 -> 32355 bytes .../jinja2/__pycache__/meta.cpython-312.pyc | Bin 0 -> 5496 bytes .../__pycache__/nativetypes.cpython-312.pyc | Bin 0 -> 7017 bytes .../jinja2/__pycache__/nodes.cpython-312.pyc | Bin 0 -> 58274 bytes .../__pycache__/optimizer.cpython-312.pyc | Bin 0 -> 2695 bytes .../jinja2/__pycache__/parser.cpython-312.pyc | Bin 0 -> 61209 bytes .../__pycache__/runtime.cpython-312.pyc | Bin 0 -> 48897 bytes .../__pycache__/sandbox.cpython-312.pyc | Bin 0 -> 18113 bytes .../jinja2/__pycache__/tests.cpython-312.pyc | Bin 0 -> 9056 bytes .../jinja2/__pycache__/utils.cpython-312.pyc | Bin 0 -> 34869 bytes .../__pycache__/visitor.cpython-312.pyc | Bin 0 -> 5371 bytes .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 99 + .../site-packages/jinja2/bccache.py | 408 + .../site-packages/jinja2/compiler.py | 1998 ++++ .../site-packages/jinja2/constants.py | 20 + .../python3.12/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1672 ++++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.12/site-packages/jinja2/ext.py | 870 ++ .../site-packages/jinja2/filters.py | 1878 ++++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.12/site-packages/jinja2/lexer.py | 868 ++ .../site-packages/jinja2/loaders.py | 693 ++ .../python3.12/site-packages/jinja2/meta.py | 112 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.12/site-packages/jinja2/nodes.py | 1206 +++ .../site-packages/jinja2/optimizer.py | 48 + .../python3.12/site-packages/jinja2/parser.py | 1049 ++ .../python3.12/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 ++ .../site-packages/jinja2/sandbox.py | 436 + .../python3.12/site-packages/jinja2/tests.py | 256 + .../python3.12/site-packages/jinja2/utils.py | 766 ++ .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markupsafe/__init__.py | 395 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 20934 bytes .../__pycache__/_native.cpython-312.pyc | Bin 0 -> 621 bytes .../site-packages/markupsafe/_native.py | 8 + .../site-packages/markupsafe/_speedups.c | 204 + .../_speedups.cpython-312-darwin.so | Bin 0 -> 50624 bytes .../site-packages/markupsafe/_speedups.pyi | 1 + .../site-packages/markupsafe/py.typed | 0 .../packaging-25.0.dist-info/INSTALLER | 1 + .../packaging-25.0.dist-info/METADATA | 105 + .../packaging-25.0.dist-info/RECORD | 40 + .../packaging-25.0.dist-info/WHEEL | 4 + .../packaging-25.0.dist-info/licenses/LICENSE | 3 + .../licenses/LICENSE.APACHE | 177 + .../licenses/LICENSE.BSD | 23 + .../site-packages/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 558 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 5023 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 9748 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 4566 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 13998 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3241 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7939 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 12750 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 27241 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 4410 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 39040 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 24816 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 6635 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 20466 bytes .../site-packages/packaging/_elffile.py | 109 + .../site-packages/packaging/_manylinux.py | 262 + .../site-packages/packaging/_musllinux.py | 85 + .../site-packages/packaging/_parser.py | 353 + .../site-packages/packaging/_structures.py | 61 + .../site-packages/packaging/_tokenizer.py | 195 + .../packaging/licenses/__init__.py | 145 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4117 bytes .../__pycache__/_spdx.cpython-312.pyc | Bin 0 -> 47364 bytes .../site-packages/packaging/licenses/_spdx.py | 759 ++ .../site-packages/packaging/markers.py | 362 + .../site-packages/packaging/metadata.py | 862 ++ .../site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 91 + .../site-packages/packaging/specifiers.py | 1019 ++ .../site-packages/packaging/tags.py | 656 ++ .../site-packages/packaging/utils.py | 163 + .../site-packages/packaging/version.py | 582 ++ .../pip-23.2.1.dist-info/AUTHORS.txt | 738 ++ .../pip-23.2.1.dist-info/INSTALLER | 1 + .../pip-23.2.1.dist-info/LICENSE.txt | 20 + .../pip-23.2.1.dist-info/METADATA | 90 + .../site-packages/pip-23.2.1.dist-info/RECORD | 1003 ++ .../pip-23.2.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.2.1.dist-info/WHEEL | 5 + .../pip-23.2.1.dist-info/entry_points.txt | 4 + .../pip-23.2.1.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 698 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 852 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2210 bytes .../site-packages/pip/_internal/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 858 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14302 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12698 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17410 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33411 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 681 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 4980 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10107 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13704 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 292 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 289 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8463 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10449 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30352 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1786 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2309 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4916 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15084 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 2628 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 18849 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7845 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 386 bytes .../pip/_internal/cli/autocompletion.py | 171 + .../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 | 508 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4013 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9390 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2101 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 4898 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13265 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10076 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7597 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4367 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2994 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1684 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6783 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3986 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 28977 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15386 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7629 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 9739 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4737 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8961 bytes .../pip/_internal/commands/cache.py | 222 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 121 + .../pip/_internal/commands/configuration.py | 282 + .../pip/_internal/commands/debug.py | 199 + .../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 | 778 ++ .../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 | 381 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 952 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2191 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1451 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8038 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1999 bytes .../pip/_internal/distributions/base.py | 39 + .../pip/_internal/distributions/installed.py | 23 + .../pip/_internal/distributions/sdist.py | 150 + .../pip/_internal/distributions/wheel.py | 34 + .../site-packages/pip/_internal/exceptions.py | 733 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 243 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21866 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40779 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 9874 bytes .../pip/_internal/index/collector.py | 505 + .../pip/_internal/index/package_finder.py | 1029 ++ .../pip/_internal/index/sources.py | 223 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16787 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6883 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8022 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3792 bytes .../pip/_internal/locations/_distutils.py | 173 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 127 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5811 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2886 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35128 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15146 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 688 ++ .../_internal/metadata/importlib/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 341 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3344 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 13171 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11174 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 224 + .../pip/_internal/metadata/importlib/_envs.py | 188 + .../pip/_internal/metadata/pkg_resources.py | 270 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 277 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1934 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 11233 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4260 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1705 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2193 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26043 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1180 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5099 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1862 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4451 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5791 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 237 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 53 + .../pip/_internal/models/link.py | 581 ++ .../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 | 110 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 265 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 21999 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 4165 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8587 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11671 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18780 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2264 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2911 bytes .../pip/_internal/network/auth.py | 561 ++ .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 519 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7590 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10125 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25829 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 214 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7130 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1891 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1925 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3076 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1692 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2033 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3940 bytes .../operations/build/build_tracker.py | 124 + .../_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-312.pyc | Bin 0 -> 277 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1828 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 34024 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 740 ++ .../pip/_internal/operations/prepare.py | 743 ++ .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3752 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 18860 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21247 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 35942 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 7223 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 33111 bytes .../pip/_internal/req/constructors.py | 506 + .../pip/_internal/req/req_file.py | 552 ++ .../pip/_internal/req/req_install.py | 874 ++ .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 650 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1196 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22541 bytes .../_internal/resolution/legacy/resolver.py | 600 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 219 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8622 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 28002 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 28524 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6219 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10389 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 4946 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 10445 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 11434 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 555 ++ .../resolution/resolvelib/factory.py | 730 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 165 + .../resolution/resolvelib/resolver.py | 299 + .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4544 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1874 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2418 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2221 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5569 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 692 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4194 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3561 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 2936 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2163 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 4001 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7463 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1172 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2350 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7562 bytes .../inject_securetransport.cpython-312.pyc | Bin 0 -> 1216 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13657 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 32762 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 0 -> 2720 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2591 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4555 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8714 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 10319 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 11114 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2408 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4488 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5995 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 | 72 + .../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 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 735 ++ .../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 | 246 + .../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 | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 542 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5034 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19135 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7610 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12489 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29107 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 | 355 + .../site-packages/pip/_vendor/__init__.py | 120 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4668 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 0 -> 41281 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 122049 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 787 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2439 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 5065 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3251 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 933 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 14650 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 3960 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6089 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 7280 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 864 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 65 + .../_vendor/cachecontrol/caches/__init__.py | 9 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 384 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7307 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2229 bytes .../_vendor/cachecontrol/caches/file_cache.py | 188 + .../cachecontrol/caches/redis_cache.py | 39 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 439 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 190 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 330 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 657 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 2861 bytes .../pip/_vendor/certifi/cacert.pem | 4589 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 108 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4580 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 0 -> 27211 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 0 -> 1399 bytes .../chardistribution.cpython-312.pyc | Bin 0 -> 9650 bytes .../charsetgroupprober.cpython-312.pyc | Bin 0 -> 4134 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 0 -> 5030 bytes .../codingstatemachine.cpython-312.pyc | Bin 0 -> 3890 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 0 -> 801 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 0 -> 1408 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 0 -> 3008 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 0 -> 4578 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 0 -> 15322 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 0 -> 4386 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 0 -> 12094 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 0 -> 1402 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 0 -> 27216 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 0 -> 1402 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 0 -> 19138 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 0 -> 1415 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 0 -> 5822 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 0 -> 22167 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 0 -> 83015 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 0 -> 1406 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 0 -> 39561 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 0 -> 83134 bytes .../langgreekmodel.cpython-312.pyc | Bin 0 -> 77000 bytes .../langhebrewmodel.cpython-312.pyc | Bin 0 -> 77511 bytes .../langhungarianmodel.cpython-312.pyc | Bin 0 -> 83088 bytes .../langrussianmodel.cpython-312.pyc | Bin 0 -> 105263 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 0 -> 77689 bytes .../langturkishmodel.cpython-312.pyc | Bin 0 -> 77528 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 0 -> 7014 bytes .../macromanprober.cpython-312.pyc | Bin 0 -> 7194 bytes .../mbcharsetprober.cpython-312.pyc | Bin 0 -> 3906 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 0 -> 1600 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 0 -> 38657 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 0 -> 644 bytes .../sbcharsetprober.cpython-312.pyc | Bin 0 -> 6399 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 0 -> 2369 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 0 -> 4498 bytes .../universaldetector.cpython-312.pyc | Bin 0 -> 12278 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 0 -> 9991 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 0 -> 3187 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 500 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-312.pyc | Bin 0 -> 207 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 0 -> 4024 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-312.pyc | Bin 0 -> 212 bytes .../__pycache__/languages.cpython-312.pyc | Bin 0 -> 9767 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../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-312.pyc | Bin 0 -> 504 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 3962 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16433 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3562 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8138 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9100 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-312.pyc | Bin 0 -> 210 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5479 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18115 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11760 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4916 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2500 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6624 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 | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1271 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45554 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 65985 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24399 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 60221 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15145 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7472 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41619 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17337 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19602 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 87589 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30167 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 52557 bytes .../pip/_vendor/distlib/compat.py | 1116 +++ .../pip/_vendor/distlib/database.py | 1350 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1300 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 152 + .../pip/_vendor/distlib/metadata.py | 1076 +++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 437 + .../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 | 1932 ++++ .../pip/_vendor/distlib/version.py | 739 ++ .../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 | 1082 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 972 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 304 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53764 bytes .../pip/_vendor/distro/distro.py | 1399 +++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 893 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4645 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 899 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16294 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 38394 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2650 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 228 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158882 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 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1843 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2037 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8680 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 43574 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-312.pyc | Bin 0 -> 642 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 478 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 12085 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 6919 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3253 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 14061 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 6958 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 31259 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 18968 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5880 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19951 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/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-312.pyc | Bin 0 -> 146486 bytes .../pip/_vendor/platformdirs/__init__.py | 566 ++ .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18041 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1958 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 9456 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 9684 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 5649 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 12453 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 323 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13011 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../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-312.pyc | Bin 0 -> 3501 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 747 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26618 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2639 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3245 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4582 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38313 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1581 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3409 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4094 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4769 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 11059 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6685 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8155 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 33001 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 13994 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-312.pyc | Bin 0 -> 37949 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6939 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4228 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4207 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7277 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 40585 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 27056 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6078 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 19967 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6897 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2943 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 6139 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9079 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5842 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15170 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-312.pyc | Bin 0 -> 14665 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 64417 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42652 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-312.pyc | Bin 0 -> 4461 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-312.pyc | Bin 0 -> 7924 bytes .../__pycache__/actions.cpython-312.pyc | Bin 0 -> 8408 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 13427 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 267721 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13007 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 48514 bytes .../__pycache__/results.cpython-312.pyc | Bin 0 -> 34123 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 17201 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 0 -> 13197 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 14917 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-312.pyc | Bin 0 -> 26826 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 +++ .../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-312.pyc | Bin 0 -> 626 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 387 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14738 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-312.pyc | Bin 0 -> 1093 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14410 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5459 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 597 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2034 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 21293 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7217 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13936 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 935 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1520 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25259 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7060 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4325 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1065 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35461 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 785 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27770 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 5972 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5630 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36282 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-312.pyc | Bin 0 -> 647 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6864 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2667 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25910 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10519 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 213 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 433 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../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-312.pyc | Bin 0 -> 7028 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10317 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7834 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205989 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1742 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2334 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 550 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 868 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12090 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4160 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1898 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3633 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5173 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 737 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6590 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13192 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 978 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 878 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28980 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2503 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3586 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 2373 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1621 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12335 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9119 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4285 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11871 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5631 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26538 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1714 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8600 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113797 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2271 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9239 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10942 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10386 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1500 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4222 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1858 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3590 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3095 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9911 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6048 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5222 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20233 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19153 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4907 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13561 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9311 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6389 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7147 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1833 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5327 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12110 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40055 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75088 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10402 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14791 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1805 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 580 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6639 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6581 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3843 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2497 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28174 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6077 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6081 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33527 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2152 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39623 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43597 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3361 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 58962 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6353 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 327 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31557 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11452 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 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../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/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 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 608 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27099 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 4819 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 2328 bytes .../__pycache__/after.cpython-312.pyc | Bin 0 -> 1637 bytes .../__pycache__/before.cpython-312.pyc | Bin 0 -> 1477 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 0 -> 2315 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 0 -> 1425 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 14294 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 0 -> 5581 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 0 -> 2599 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 0 -> 12426 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/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-312.pyc | Bin 0 -> 397 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26940 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3921 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 379 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/typing_extensions.py | 3072 ++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3418 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 15944 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 231 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20420 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36292 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13506 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10426 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4031 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20315 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 6368 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33979 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-312.pyc | Bin 0 -> 211 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1861 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11577 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5732 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24463 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35557 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7524 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 228 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17440 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14814 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-312.pyc | Bin 0 -> 212 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41332 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 222 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1833 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7341 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 | 170 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1159 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4769 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1565 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1365 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4196 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 3002 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21698 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15116 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5084 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10780 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11152 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15808 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4416 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 + .../site-packages/pip/_vendor/vendor.txt | 23 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 12008 bytes .../__pycache__/labels.cpython-312.pyc | Bin 0 -> 7145 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 0 -> 2709 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 9052 bytes .../x_user_defined.cpython-312.pyc | Bin 0 -> 3308 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 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../psycopg2/.dylibs/libcom_err.3.0.dylib | Bin 0 -> 71104 bytes .../psycopg2/.dylibs/libcrypto.3.dylib | Bin 0 -> 4222880 bytes .../psycopg2/.dylibs/libgssapi_krb5.2.2.dylib | Bin 0 -> 326512 bytes .../psycopg2/.dylibs/libintl.8.dylib | Bin 0 -> 162656 bytes .../psycopg2/.dylibs/libk5crypto.3.1.dylib | Bin 0 -> 197616 bytes .../psycopg2/.dylibs/libkrb5.3.3.dylib | Bin 0 -> 791520 bytes .../psycopg2/.dylibs/libkrb5support.1.1.dylib | Bin 0 -> 96128 bytes .../psycopg2/.dylibs/libpq.5.dylib | Bin 0 -> 336784 bytes .../psycopg2/.dylibs/libssl.3.dylib | Bin 0 -> 838768 bytes .../site-packages/psycopg2/__init__.py | 126 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3760 bytes .../__pycache__/_ipaddress.cpython-312.pyc | Bin 0 -> 2636 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 7485 bytes .../__pycache__/_range.cpython-312.pyc | Bin 0 -> 21056 bytes .../__pycache__/errorcodes.cpython-312.pyc | Bin 0 -> 14447 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 544 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 7470 bytes .../__pycache__/extras.cpython-312.pyc | Bin 0 -> 60554 bytes .../psycopg2/__pycache__/pool.cpython-312.pyc | Bin 0 -> 7840 bytes .../psycopg2/__pycache__/sql.cpython-312.pyc | Bin 0 -> 18944 bytes .../psycopg2/__pycache__/tz.cpython-312.pyc | Bin 0 -> 6206 bytes .../site-packages/psycopg2/_ipaddress.py | 90 + .../site-packages/psycopg2/_json.py | 199 + .../psycopg2/_psycopg.cpython-312-darwin.so | Bin 0 -> 330384 bytes .../site-packages/psycopg2/_range.py | 554 ++ .../site-packages/psycopg2/errorcodes.py | 450 + .../site-packages/psycopg2/errors.py | 38 + .../site-packages/psycopg2/extensions.py | 213 + .../site-packages/psycopg2/extras.py | 1340 +++ .../python3.12/site-packages/psycopg2/pool.py | 187 + .../python3.12/site-packages/psycopg2/sql.py | 455 + .../python3.12/site-packages/psycopg2/tz.py | 158 + .../INSTALLER | 1 + .../psycopg2_binary-2.9.10.dist-info/LICENSE | 49 + .../psycopg2_binary-2.9.10.dist-info/METADATA | 123 + .../psycopg2_binary-2.9.10.dist-info/RECORD | 39 + .../REQUESTED | 0 .../psycopg2_binary-2.9.10.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../python_dotenv-1.0.1.dist-info/INSTALLER | 1 + .../python_dotenv-1.0.1.dist-info/LICENSE | 27 + .../python_dotenv-1.0.1.dist-info/METADATA | 692 ++ .../python_dotenv-1.0.1.dist-info/RECORD | 26 + .../python_dotenv-1.0.1.dist-info/REQUESTED | 0 .../python_dotenv-1.0.1.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../pytz-2025.1.dist-info/INSTALLER | 1 + .../pytz-2025.1.dist-info/LICENSE.txt | 19 + .../pytz-2025.1.dist-info/METADATA | 648 ++ .../pytz-2025.1.dist-info/RECORD | 623 ++ .../pytz-2025.1.dist-info/REQUESTED | 0 .../site-packages/pytz-2025.1.dist-info/WHEEL | 6 + .../pytz-2025.1.dist-info/top_level.txt | 1 + .../pytz-2025.1.dist-info/zip-safe | 1 + .../python3.12/site-packages/pytz/__init__.py | 1554 +++ .../pytz/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 30514 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2313 bytes .../pytz/__pycache__/lazy.cpython-312.pyc | Bin 0 -> 7706 bytes .../__pycache__/reference.cpython-312.pyc | Bin 0 -> 5543 bytes .../pytz/__pycache__/tzfile.cpython-312.pyc | Bin 0 -> 5277 bytes .../pytz/__pycache__/tzinfo.cpython-312.pyc | Bin 0 -> 19295 bytes .../site-packages/pytz/exceptions.py | 59 + .../lib/python3.12/site-packages/pytz/lazy.py | 172 + .../site-packages/pytz/reference.py | 140 + .../python3.12/site-packages/pytz/tzfile.py | 133 + .../python3.12/site-packages/pytz/tzinfo.py | 580 ++ .../pytz/zoneinfo/Africa/Abidjan | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 0 -> 735 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 0 -> 194 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 0 -> 2399 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 0 -> 2429 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 0 -> 2052 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 0 -> 2295 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 0 -> 246 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 0 -> 679 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 0 -> 679 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 0 -> 208 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 0 -> 199 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 0 -> 254 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 0 -> 625 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 0 -> 689 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 0 -> 955 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Anchorage | Bin 0 -> 2371 bytes .../pytz/zoneinfo/America/Anguilla | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Antigua | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Araguaina | Bin 0 -> 870 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1062 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1062 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1088 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1090 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1062 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Asuncion | Bin 0 -> 1644 bytes .../pytz/zoneinfo/America/Atikokan | Bin 0 -> 182 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 0 -> 1010 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Barbados | Bin 0 -> 436 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 0 -> 562 bytes .../pytz/zoneinfo/America/Belize | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 0 -> 618 bytes .../pytz/zoneinfo/America/Bogota | Bin 0 -> 232 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 0 -> 2410 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2254 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Cancun | Bin 0 -> 864 bytes .../pytz/zoneinfo/America/Caracas | Bin 0 -> 250 bytes .../pytz/zoneinfo/America/Catamarca | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Cayenne | Bin 0 -> 184 bytes .../pytz/zoneinfo/America/Cayman | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Chicago | Bin 0 -> 3592 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 0 -> 1102 bytes .../pytz/zoneinfo/America/Ciudad_Juarez | Bin 0 -> 1538 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Cordoba | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 0 -> 316 bytes .../pytz/zoneinfo/America/Creston | Bin 0 -> 360 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 0 -> 1402 bytes .../pytz/zoneinfo/America/Curacao | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 0 -> 698 bytes .../pytz/zoneinfo/America/Dawson | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 0 -> 1050 bytes .../pytz/zoneinfo/America/Denver | Bin 0 -> 2460 bytes .../pytz/zoneinfo/America/Detroit | Bin 0 -> 2230 bytes .../pytz/zoneinfo/America/Dominica | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Edmonton | Bin 0 -> 2332 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 0 -> 642 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 0 -> 224 bytes .../pytz/zoneinfo/America/Ensenada | Bin 0 -> 2458 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 0 -> 2240 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 0 -> 2192 bytes .../pytz/zoneinfo/America/Godthab | Bin 0 -> 1889 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 0 -> 3210 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 0 -> 1834 bytes .../pytz/zoneinfo/America/Grenada | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Guatemala | Bin 0 -> 280 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 0 -> 232 bytes .../pytz/zoneinfo/America/Guyana | Bin 0 -> 248 bytes .../pytz/zoneinfo/America/Halifax | Bin 0 -> 3424 bytes .../pytz/zoneinfo/America/Havana | Bin 0 -> 2416 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 0 -> 388 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1738 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1920 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1700 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1710 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1794 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Inuvik | Bin 0 -> 2074 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Juneau | Bin 0 -> 2353 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2788 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2368 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/La_Paz | Bin 0 -> 218 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 0 -> 392 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 0 -> 2852 bytes .../pytz/zoneinfo/America/Louisville | Bin 0 -> 2788 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Maceio | Bin 0 -> 730 bytes .../pytz/zoneinfo/America/Managua | Bin 0 -> 430 bytes .../pytz/zoneinfo/America/Manaus | Bin 0 -> 590 bytes .../pytz/zoneinfo/America/Marigot | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Martinique | Bin 0 -> 232 bytes .../pytz/zoneinfo/America/Matamoros | Bin 0 -> 1418 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 0 -> 1060 bytes .../pytz/zoneinfo/America/Mendoza | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Menominee | Bin 0 -> 2274 bytes .../pytz/zoneinfo/America/Merida | Bin 0 -> 1004 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 0 -> 1423 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 0 -> 1222 bytes .../pytz/zoneinfo/America/Miquelon | Bin 0 -> 1652 bytes .../pytz/zoneinfo/America/Moncton | Bin 0 -> 3154 bytes .../pytz/zoneinfo/America/Monterrey | Bin 0 -> 1114 bytes .../pytz/zoneinfo/America/Montevideo | Bin 0 -> 1496 bytes .../pytz/zoneinfo/America/Montreal | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Montserrat | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Nassau | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/New_York | Bin 0 -> 3552 bytes .../pytz/zoneinfo/America/Nipigon | Bin 0 -> 3494 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 0 -> 2367 bytes .../pytz/zoneinfo/America/Noronha | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2396 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 0 -> 2396 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2396 bytes .../site-packages/pytz/zoneinfo/America/Nuuk | Bin 0 -> 1889 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 0 -> 1524 bytes .../pytz/zoneinfo/America/Panama | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 0 -> 248 bytes .../pytz/zoneinfo/America/Phoenix | Bin 0 -> 360 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 0 -> 1434 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 0 -> 614 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 0 -> 562 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 0 -> 1902 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 0 -> 2868 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 0 -> 2066 bytes .../pytz/zoneinfo/America/Recife | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/Regina | Bin 0 -> 980 bytes .../pytz/zoneinfo/America/Resolute | Bin 0 -> 2066 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 0 -> 614 bytes .../pytz/zoneinfo/America/Rosario | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 0 -> 2458 bytes .../pytz/zoneinfo/America/Santarem | Bin 0 -> 588 bytes .../pytz/zoneinfo/America/Santiago | Bin 0 -> 2515 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 0 -> 458 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 0 -> 1935 bytes .../pytz/zoneinfo/America/Shiprock | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 0 -> 2329 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Johns | Bin 0 -> 3655 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 0 -> 560 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 0 -> 252 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 0 -> 1502 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tijuana | Bin 0 -> 2458 bytes .../pytz/zoneinfo/America/Toronto | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tortola | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Vancouver | Bin 0 -> 2892 bytes .../pytz/zoneinfo/America/Virgin | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 0 -> 2868 bytes .../pytz/zoneinfo/America/Yakutat | Bin 0 -> 2305 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 0 -> 2332 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 0 -> 423 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 0 -> 283 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 172 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 0 -> 2260 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 0 -> 185 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 0 -> 1404 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 0 -> 150 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 0 -> 151 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 0 -> 1148 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 0 -> 213 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Asia/Aden | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 0 -> 983 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 0 -> 1433 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 0 -> 1174 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 0 -> 997 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 0 -> 605 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 0 -> 605 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 0 -> 977 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Baku | Bin 0 -> 1213 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 0 -> 2154 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 0 -> 469 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 0 -> 1207 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 0 -> 877 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 0 -> 358 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 0 -> 323 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 0 -> 1873 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 0 -> 323 bytes .../site-packages/pytz/zoneinfo/Asia/Dili | Bin 0 -> 257 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 0 -> 577 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 0 -> 2028 bytes .../site-packages/pytz/zoneinfo/Asia/Gaza | Bin 0 -> 3844 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 0 -> 3872 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 337 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1233 bytes .../site-packages/pytz/zoneinfo/Asia/Hovd | Bin 0 -> 877 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 0 -> 383 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 0 -> 221 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 0 -> 194 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 0 -> 1152 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 0 -> 379 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 0 -> 151 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 0 -> 198 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 0 -> 198 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 0 -> 1257 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 0 -> 285 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1193 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 401 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 0 -> 469 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 0 -> 1208 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 0 -> 422 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 0 -> 2002 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1151 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Omsk | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Asia/Oral | Bin 0 -> 991 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 185 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 0 -> 353 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 0 -> 237 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin 0 -> 1025 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1011 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 0 -> 337 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 0 -> 1188 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 0 -> 563 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 0 -> 401 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1194 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 0 -> 761 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 0 -> 577 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 0 -> 1021 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 0 -> 1248 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 0 -> 189 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 0 -> 189 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 0 -> 1207 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 254 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 877 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 877 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1238 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 0 -> 185 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 0 -> 1194 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 0 -> 254 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 0 -> 1137 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 0 -> 3442 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 0 -> 2396 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 0 -> 1897 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 256 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 0 -> 3377 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 148 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 150 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 0 -> 148 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 0 -> 1200 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 0 -> 2208 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 0 -> 419 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2229 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Currie | Bin 0 -> 2358 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 0 -> 325 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 0 -> 456 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 0 -> 2358 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 0 -> 1846 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 0 -> 475 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1846 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 0 -> 2190 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/North | Bin 0 -> 325 bytes .../pytz/zoneinfo/Australia/Perth | Bin 0 -> 446 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 0 -> 419 bytes .../pytz/zoneinfo/Australia/South | Bin 0 -> 2208 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 0 -> 2358 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/West | Bin 0 -> 446 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 0 -> 2229 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 0 -> 614 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 0 -> 702 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 0 -> 1430 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 0 -> 590 bytes .../site-packages/pytz/zoneinfo/CET | Bin 0 -> 2933 bytes .../site-packages/pytz/zoneinfo/CST6CDT | Bin 0 -> 3592 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 0 -> 3424 bytes .../pytz/zoneinfo/Canada/Central | Bin 0 -> 2868 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 0 -> 3494 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 0 -> 2332 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 0 -> 3655 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 0 -> 2892 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 0 -> 980 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 0 -> 1614 bytes .../pytz/zoneinfo/Chile/Continental | Bin 0 -> 2515 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 0 -> 2219 bytes .../site-packages/pytz/zoneinfo/Cuba | Bin 0 -> 2416 bytes .../site-packages/pytz/zoneinfo/EET | Bin 0 -> 2262 bytes .../site-packages/pytz/zoneinfo/EST | Bin 0 -> 182 bytes .../site-packages/pytz/zoneinfo/EST5EDT | Bin 0 -> 3552 bytes .../site-packages/pytz/zoneinfo/Egypt | Bin 0 -> 2399 bytes .../site-packages/pytz/zoneinfo/Eire | Bin 0 -> 3492 bytes .../site-packages/pytz/zoneinfo/Etc/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Zulu | Bin 0 -> 114 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 0 -> 2933 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 0 -> 1742 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 0 -> 1151 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 0 -> 2262 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 0 -> 2301 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 0 -> 2933 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 0 -> 2184 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 0 -> 2368 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 0 -> 3492 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 0 -> 3068 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 0 -> 1900 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1493 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 0 -> 1185 bytes .../site-packages/pytz/zoneinfo/Europe/Kyiv | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 0 -> 3527 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 0 -> 2933 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 0 -> 2614 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 0 -> 2620 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 0 -> 1900 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 0 -> 1307 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 0 -> 2962 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 0 -> 1535 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 0 -> 2002 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 0 -> 2962 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 0 -> 2301 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 0 -> 2198 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 0 -> 1201 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 0 -> 2641 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 0 -> 1169 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 0 -> 1469 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 0 -> 2077 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 0 -> 2148 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 0 -> 2084 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1253 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 0 -> 2200 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 0 -> 2162 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 0 -> 1909 bytes .../site-packages/pytz/zoneinfo/Factory | Bin 0 -> 116 bytes .../python3.12/site-packages/pytz/zoneinfo/GB | Bin 0 -> 3664 bytes .../site-packages/pytz/zoneinfo/GB-Eire | Bin 0 -> 3664 bytes .../site-packages/pytz/zoneinfo/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Greenwich | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/HST | Bin 0 -> 329 bytes .../site-packages/pytz/zoneinfo/Hongkong | Bin 0 -> 1233 bytes .../site-packages/pytz/zoneinfo/Iceland | Bin 0 -> 148 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 0 -> 185 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 0 -> 265 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 0 -> 151 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 0 -> 185 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 0 -> 227 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 0 -> 265 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Iran | Bin 0 -> 1248 bytes .../site-packages/pytz/zoneinfo/Israel | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/Japan | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Kwajalein | Bin 0 -> 302 bytes .../site-packages/pytz/zoneinfo/Libya | Bin 0 -> 625 bytes .../site-packages/pytz/zoneinfo/MET | Bin 0 -> 2933 bytes .../site-packages/pytz/zoneinfo/MST | Bin 0 -> 360 bytes .../site-packages/pytz/zoneinfo/MST7MDT | Bin 0 -> 2460 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2458 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 0 -> 1060 bytes .../pytz/zoneinfo/Mexico/General | Bin 0 -> 1222 bytes .../python3.12/site-packages/pytz/zoneinfo/NZ | Bin 0 -> 2437 bytes .../site-packages/pytz/zoneinfo/NZ-CHAT | Bin 0 -> 2054 bytes .../site-packages/pytz/zoneinfo/Navajo | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/PRC | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/PST8PDT | Bin 0 -> 2852 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 0 -> 598 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 0 -> 254 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 0 -> 2054 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 0 -> 172 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 0 -> 2219 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 0 -> 524 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 0 -> 220 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 0 -> 186 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 0 -> 564 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 0 -> 224 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 0 -> 150 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 152 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 0 -> 494 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Kanton | Bin 0 -> 220 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 0 -> 224 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 0 -> 337 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 0 -> 302 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 0 -> 159 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 0 -> 238 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 0 -> 189 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 0 -> 866 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 0 -> 290 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 0 -> 166 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 0 -> 188 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 172 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 0 -> 589 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 0 -> 494 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 0 -> 175 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 0 -> 151 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 0 -> 358 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 0 -> 172 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 0 -> 152 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 0 -> 172 bytes .../site-packages/pytz/zoneinfo/Poland | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Portugal | Bin 0 -> 3527 bytes .../site-packages/pytz/zoneinfo/ROC | Bin 0 -> 761 bytes .../site-packages/pytz/zoneinfo/ROK | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Singapore | Bin 0 -> 401 bytes .../site-packages/pytz/zoneinfo/Turkey | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/US/Alaska | Bin 0 -> 2371 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 0 -> 360 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 0 -> 3592 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 0 -> 1682 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 0 -> 3552 bytes .../site-packages/pytz/zoneinfo/US/Hawaii | Bin 0 -> 329 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 0 -> 2444 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 0 -> 2230 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 0 -> 2852 bytes .../site-packages/pytz/zoneinfo/US/Samoa | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/W-SU | Bin 0 -> 1535 bytes .../site-packages/pytz/zoneinfo/WET | Bin 0 -> 3527 bytes .../site-packages/pytz/zoneinfo/Zulu | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 279 + .../site-packages/pytz/zoneinfo/leapseconds | 79 + .../site-packages/pytz/zoneinfo/tzdata.zi | 4286 ++++++++ .../site-packages/pytz/zoneinfo/zone.tab | 447 + .../site-packages/pytz/zoneinfo/zone1970.tab | 374 + .../site-packages/pytz/zoneinfo/zonenow.tab | 296 + .../six-1.17.0.dist-info/INSTALLER | 1 + .../six-1.17.0.dist-info/LICENSE | 18 + .../six-1.17.0.dist-info/METADATA | 43 + .../site-packages/six-1.17.0.dist-info/RECORD | 9 + .../six-1.17.0.dist-info/REQUESTED | 0 .../site-packages/six-1.17.0.dist-info/WHEEL | 6 + .../six-1.17.0.dist-info/top_level.txt | 1 + .../venv/lib/python3.12/site-packages/six.py | 1003 ++ .../site-packages/sqlalchemy/__init__.py | 294 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 9949 bytes .../__pycache__/events.cpython-312.pyc | Bin 0 -> 567 bytes .../__pycache__/exc.cpython-312.pyc | Bin 0 -> 31238 bytes .../__pycache__/inspection.cpython-312.pyc | Bin 0 -> 6670 bytes .../__pycache__/log.cpython-312.pyc | Bin 0 -> 11628 bytes .../__pycache__/schema.cpython-312.pyc | Bin 0 -> 2346 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 2294 bytes .../sqlalchemy/connectors/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 606 bytes .../__pycache__/aioodbc.cpython-312.pyc | Bin 0 -> 7076 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 0 -> 12429 bytes .../__pycache__/pyodbc.cpython-312.pyc | Bin 0 -> 9383 bytes .../sqlalchemy/connectors/aioodbc.py | 174 + .../sqlalchemy/connectors/asyncio.py | 213 + .../sqlalchemy/connectors/pyodbc.py | 249 + .../sqlalchemy/cyextension/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../collections.cpython-312-darwin.so | Bin 0 -> 247360 bytes .../sqlalchemy/cyextension/collections.pyx | 409 + .../immutabledict.cpython-312-darwin.so | Bin 0 -> 122336 bytes .../sqlalchemy/cyextension/immutabledict.pxd | 8 + .../sqlalchemy/cyextension/immutabledict.pyx | 133 + .../processors.cpython-312-darwin.so | Bin 0 -> 102928 bytes .../sqlalchemy/cyextension/processors.pyx | 68 + .../resultproxy.cpython-312-darwin.so | Bin 0 -> 104864 bytes .../sqlalchemy/cyextension/resultproxy.pyx | 102 + .../cyextension/util.cpython-312-darwin.so | Bin 0 -> 122296 bytes .../sqlalchemy/cyextension/util.pyx | 91 + .../sqlalchemy/dialects/__init__.py | 61 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1895 bytes .../__pycache__/_typing.cpython-312.pyc | Bin 0 -> 1096 bytes .../sqlalchemy/dialects/_typing.py | 30 + .../sqlalchemy/dialects/mssql/__init__.py | 88 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1674 bytes .../mssql/__pycache__/aioodbc.cpython-312.pyc | Bin 0 -> 2415 bytes .../mssql/__pycache__/base.cpython-312.pyc | Bin 0 -> 152580 bytes .../information_schema.cpython-312.pyc | Bin 0 -> 8086 bytes .../mssql/__pycache__/json.cpython-312.pyc | Bin 0 -> 5231 bytes .../__pycache__/provision.cpython-312.pyc | Bin 0 -> 7458 bytes .../mssql/__pycache__/pymssql.cpython-312.pyc | Bin 0 -> 5963 bytes .../mssql/__pycache__/pyodbc.cpython-312.pyc | Bin 0 -> 30627 bytes .../sqlalchemy/dialects/mssql/aioodbc.py | 63 + .../sqlalchemy/dialects/mssql/base.py | 4058 ++++++++ .../dialects/mssql/information_schema.py | 254 + .../sqlalchemy/dialects/mssql/json.py | 129 + .../sqlalchemy/dialects/mssql/provision.py | 162 + .../sqlalchemy/dialects/mssql/pymssql.py | 126 + .../sqlalchemy/dialects/mssql/pyodbc.py | 760 ++ .../sqlalchemy/dialects/mysql/__init__.py | 104 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2003 bytes .../__pycache__/aiomysql.cpython-312.pyc | Bin 0 -> 16959 bytes .../mysql/__pycache__/asyncmy.cpython-312.pyc | Bin 0 -> 17436 bytes .../mysql/__pycache__/base.cpython-312.pyc | Bin 0 -> 139882 bytes .../mysql/__pycache__/cymysql.cpython-312.pyc | Bin 0 -> 3149 bytes .../mysql/__pycache__/dml.cpython-312.pyc | Bin 0 -> 8361 bytes .../__pycache__/enumerated.cpython-312.pyc | Bin 0 -> 10199 bytes .../__pycache__/expression.cpython-312.pyc | Bin 0 -> 5052 bytes .../mysql/__pycache__/json.cpython-312.pyc | Bin 0 -> 3453 bytes .../mysql/__pycache__/mariadb.cpython-312.pyc | Bin 0 -> 2259 bytes .../mariadbconnector.cpython-312.pyc | Bin 0 -> 11689 bytes .../mysqlconnector.cpython-312.pyc | Bin 0 -> 9180 bytes .../mysql/__pycache__/mysqldb.cpython-312.pyc | Bin 0 -> 11779 bytes .../__pycache__/provision.cpython-312.pyc | Bin 0 -> 4285 bytes .../mysql/__pycache__/pymysql.cpython-312.pyc | Bin 0 -> 5316 bytes .../mysql/__pycache__/pyodbc.cpython-312.pyc | Bin 0 -> 5272 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 0 -> 24105 bytes .../reserved_words.cpython-312.pyc | Bin 0 -> 4403 bytes .../mysql/__pycache__/types.cpython-312.pyc | Bin 0 -> 30484 bytes .../sqlalchemy/dialects/mysql/aiomysql.py | 335 + .../sqlalchemy/dialects/mysql/asyncmy.py | 339 + .../sqlalchemy/dialects/mysql/base.py | 3545 +++++++ .../sqlalchemy/dialects/mysql/cymysql.py | 84 + .../sqlalchemy/dialects/mysql/dml.py | 225 + .../sqlalchemy/dialects/mysql/enumerated.py | 243 + .../sqlalchemy/dialects/mysql/expression.py | 143 + .../sqlalchemy/dialects/mysql/json.py | 81 + .../sqlalchemy/dialects/mysql/mariadb.py | 61 + .../dialects/mysql/mariadbconnector.py | 277 + .../dialects/mysql/mysqlconnector.py | 180 + .../sqlalchemy/dialects/mysql/mysqldb.py | 305 + .../sqlalchemy/dialects/mysql/provision.py | 110 + .../sqlalchemy/dialects/mysql/pymysql.py | 136 + .../sqlalchemy/dialects/mysql/pyodbc.py | 139 + .../sqlalchemy/dialects/mysql/reflection.py | 677 ++ .../dialects/mysql/reserved_words.py | 571 ++ .../sqlalchemy/dialects/mysql/types.py | 774 ++ .../sqlalchemy/dialects/oracle/__init__.py | 67 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1360 bytes .../oracle/__pycache__/base.cpython-312.pyc | Bin 0 -> 137566 bytes .../__pycache__/cx_oracle.cpython-312.pyc | Bin 0 -> 60743 bytes .../__pycache__/dictionary.cpython-312.pyc | Bin 0 -> 24610 bytes .../__pycache__/oracledb.cpython-312.pyc | Bin 0 -> 41477 bytes .../__pycache__/provision.cpython-312.pyc | Bin 0 -> 10872 bytes .../oracle/__pycache__/types.cpython-312.pyc | Bin 0 -> 13224 bytes .../sqlalchemy/dialects/oracle/base.py | 3359 +++++++ .../sqlalchemy/dialects/oracle/cx_oracle.py | 1552 +++ .../sqlalchemy/dialects/oracle/dictionary.py | 507 + .../sqlalchemy/dialects/oracle/oracledb.py | 947 ++ .../sqlalchemy/dialects/oracle/provision.py | 220 + .../sqlalchemy/dialects/oracle/types.py | 316 + .../dialects/postgresql/__init__.py | 167 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3444 bytes .../_psycopg_common.cpython-312.pyc | Bin 0 -> 7710 bytes .../__pycache__/array.cpython-312.pyc | Bin 0 -> 16712 bytes .../__pycache__/asyncpg.cpython-312.pyc | Bin 0 -> 58162 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 204803 bytes .../__pycache__/dml.cpython-312.pyc | Bin 0 -> 12598 bytes .../__pycache__/ext.cpython-312.pyc | Bin 0 -> 19311 bytes .../__pycache__/hstore.cpython-312.pyc | Bin 0 -> 15380 bytes .../__pycache__/json.cpython-312.pyc | Bin 0 -> 13940 bytes .../__pycache__/named_types.cpython-312.pyc | Bin 0 -> 22920 bytes .../__pycache__/operators.cpython-312.pyc | Bin 0 -> 2167 bytes .../__pycache__/pg8000.cpython-312.pyc | Bin 0 -> 30264 bytes .../__pycache__/pg_catalog.cpython-312.pyc | Bin 0 -> 10966 bytes .../__pycache__/provision.cpython-312.pyc | Bin 0 -> 7790 bytes .../__pycache__/psycopg.cpython-312.pyc | Bin 0 -> 37561 bytes .../__pycache__/psycopg2.cpython-312.pyc | Bin 0 -> 35998 bytes .../__pycache__/psycopg2cffi.cpython-312.pyc | Bin 0 -> 2174 bytes .../__pycache__/ranges.cpython-312.pyc | Bin 0 -> 34776 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 11059 bytes .../dialects/postgresql/_psycopg_common.py | 187 + .../sqlalchemy/dialects/postgresql/array.py | 435 + .../sqlalchemy/dialects/postgresql/asyncpg.py | 1287 +++ .../sqlalchemy/dialects/postgresql/base.py | 5038 ++++++++++ .../sqlalchemy/dialects/postgresql/dml.py | 339 + .../sqlalchemy/dialects/postgresql/ext.py | 501 + .../sqlalchemy/dialects/postgresql/hstore.py | 406 + .../sqlalchemy/dialects/postgresql/json.py | 338 + .../dialects/postgresql/named_types.py | 505 + .../dialects/postgresql/operators.py | 129 + .../sqlalchemy/dialects/postgresql/pg8000.py | 666 ++ .../dialects/postgresql/pg_catalog.py | 300 + .../dialects/postgresql/provision.py | 175 + .../sqlalchemy/dialects/postgresql/psycopg.py | 783 ++ .../dialects/postgresql/psycopg2.py | 892 ++ .../dialects/postgresql/psycopg2cffi.py | 61 + .../sqlalchemy/dialects/postgresql/ranges.py | 1031 ++ .../sqlalchemy/dialects/postgresql/types.py | 303 + .../sqlalchemy/dialects/sqlite/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1070 bytes .../__pycache__/aiosqlite.cpython-312.pyc | Bin 0 -> 17935 bytes .../sqlite/__pycache__/base.cpython-312.pyc | Bin 0 -> 101601 bytes .../sqlite/__pycache__/dml.cpython-312.pyc | Bin 0 -> 10053 bytes .../sqlite/__pycache__/json.cpython-312.pyc | Bin 0 -> 3782 bytes .../__pycache__/provision.cpython-312.pyc | Bin 0 -> 7303 bytes .../__pycache__/pysqlcipher.cpython-312.pyc | Bin 0 -> 6229 bytes .../__pycache__/pysqlite.cpython-312.pyc | Bin 0 -> 31456 bytes .../sqlalchemy/dialects/sqlite/aiosqlite.py | 399 + .../sqlalchemy/dialects/sqlite/base.py | 2860 ++++++ .../sqlalchemy/dialects/sqlite/dml.py | 263 + .../sqlalchemy/dialects/sqlite/json.py | 92 + .../sqlalchemy/dialects/sqlite/provision.py | 198 + .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 157 + .../sqlalchemy/dialects/sqlite/pysqlite.py | 771 ++ .../dialects/type_migration_guidelines.txt | 145 + .../sqlalchemy/engine/__init__.py | 62 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2285 bytes .../_py_processors.cpython-312.pyc | Bin 0 -> 4508 bytes .../__pycache__/_py_row.cpython-312.pyc | Bin 0 -> 5777 bytes .../__pycache__/_py_util.cpython-312.pyc | Bin 0 -> 2189 bytes .../engine/__pycache__/base.cpython-312.pyc | Bin 0 -> 130007 bytes .../characteristics.cpython-312.pyc | Bin 0 -> 6854 bytes .../engine/__pycache__/create.cpython-312.pyc | Bin 0 -> 34378 bytes .../engine/__pycache__/cursor.cpython-312.pyc | Bin 0 -> 79303 bytes .../__pycache__/default.cpython-312.pyc | Bin 0 -> 87999 bytes .../engine/__pycache__/events.cpython-312.pyc | Bin 0 -> 39937 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 0 -> 99581 bytes .../engine/__pycache__/mock.cpython-312.pyc | Bin 0 -> 5710 bytes .../__pycache__/processors.cpython-312.pyc | Bin 0 -> 1299 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 0 -> 80634 bytes .../engine/__pycache__/result.cpython-312.pyc | Bin 0 -> 91138 bytes .../engine/__pycache__/row.cpython-312.pyc | Bin 0 -> 17428 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 0 -> 568 bytes .../engine/__pycache__/url.cpython-312.pyc | Bin 0 -> 34426 bytes .../engine/__pycache__/util.cpython-312.pyc | Bin 0 -> 6641 bytes .../sqlalchemy/engine/_py_processors.py | 136 + .../sqlalchemy/engine/_py_row.py | 128 + .../sqlalchemy/engine/_py_util.py | 74 + .../site-packages/sqlalchemy/engine/base.py | 3371 +++++++ .../sqlalchemy/engine/characteristics.py | 155 + .../site-packages/sqlalchemy/engine/create.py | 878 ++ .../site-packages/sqlalchemy/engine/cursor.py | 2176 +++++ .../sqlalchemy/engine/default.py | 2367 +++++ .../site-packages/sqlalchemy/engine/events.py | 965 ++ .../sqlalchemy/engine/interfaces.py | 3406 +++++++ .../site-packages/sqlalchemy/engine/mock.py | 133 + .../sqlalchemy/engine/processors.py | 61 + .../sqlalchemy/engine/reflection.py | 2099 ++++ .../site-packages/sqlalchemy/engine/result.py | 2380 +++++ .../site-packages/sqlalchemy/engine/row.py | 400 + .../sqlalchemy/engine/strategies.py | 19 + .../site-packages/sqlalchemy/engine/url.py | 924 ++ .../site-packages/sqlalchemy/engine/util.py | 167 + .../sqlalchemy/event/__init__.py | 25 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 848 bytes .../event/__pycache__/api.cpython-312.pyc | Bin 0 -> 9090 bytes .../event/__pycache__/attr.cpython-312.pyc | Bin 0 -> 30407 bytes .../event/__pycache__/base.cpython-312.pyc | Bin 0 -> 19828 bytes .../event/__pycache__/legacy.cpython-312.pyc | Bin 0 -> 9383 bytes .../__pycache__/registry.cpython-312.pyc | Bin 0 -> 12624 bytes .../site-packages/sqlalchemy/event/api.py | 222 + .../site-packages/sqlalchemy/event/attr.py | 655 ++ .../site-packages/sqlalchemy/event/base.py | 470 + .../site-packages/sqlalchemy/event/legacy.py | 246 + .../sqlalchemy/event/registry.py | 390 + .../site-packages/sqlalchemy/events.py | 17 + .../site-packages/sqlalchemy/exc.py | 832 ++ .../site-packages/sqlalchemy/ext/__init__.py | 11 + .../ext/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 361 bytes .../associationproxy.cpython-312.pyc | Bin 0 -> 87003 bytes .../ext/__pycache__/automap.cpython-312.pyc | Bin 0 -> 57401 bytes .../ext/__pycache__/baked.cpython-312.pyc | Bin 0 -> 23407 bytes .../ext/__pycache__/compiler.cpython-312.pyc | Bin 0 -> 21259 bytes .../horizontal_shard.cpython-312.pyc | Bin 0 -> 17655 bytes .../ext/__pycache__/hybrid.cpython-312.pyc | Bin 0 -> 59832 bytes .../ext/__pycache__/indexable.cpython-312.pyc | Bin 0 -> 12196 bytes .../instrumentation.cpython-312.pyc | Bin 0 -> 19896 bytes .../ext/__pycache__/mutable.cpython-312.pyc | Bin 0 -> 46374 bytes .../__pycache__/orderinglist.cpython-312.pyc | Bin 0 -> 17343 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 0 -> 8056 bytes .../sqlalchemy/ext/associationproxy.py | 2013 ++++ .../sqlalchemy/ext/asyncio/__init__.py | 25 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 984 bytes .../asyncio/__pycache__/base.cpython-312.pyc | Bin 0 -> 11213 bytes .../__pycache__/engine.cpython-312.pyc | Bin 0 -> 57441 bytes .../asyncio/__pycache__/exc.cpython-312.pyc | Bin 0 -> 1044 bytes .../__pycache__/result.cpython-312.pyc | Bin 0 -> 37447 bytes .../__pycache__/scoping.cpython-312.pyc | Bin 0 -> 57012 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 71483 bytes .../sqlalchemy/ext/asyncio/base.py | 281 + .../sqlalchemy/ext/asyncio/engine.py | 1467 +++ .../sqlalchemy/ext/asyncio/exc.py | 21 + .../sqlalchemy/ext/asyncio/result.py | 961 ++ .../sqlalchemy/ext/asyncio/scoping.py | 1614 ++++ .../sqlalchemy/ext/asyncio/session.py | 1943 ++++ .../site-packages/sqlalchemy/ext/automap.py | 1701 ++++ .../site-packages/sqlalchemy/ext/baked.py | 570 ++ .../site-packages/sqlalchemy/ext/compiler.py | 600 ++ .../sqlalchemy/ext/declarative/__init__.py | 65 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2020 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 21288 bytes .../sqlalchemy/ext/declarative/extensions.py | 564 ++ .../sqlalchemy/ext/horizontal_shard.py | 478 + .../site-packages/sqlalchemy/ext/hybrid.py | 1533 +++ .../site-packages/sqlalchemy/ext/indexable.py | 345 + .../sqlalchemy/ext/instrumentation.py | 450 + .../site-packages/sqlalchemy/ext/mutable.py | 1095 +++ .../sqlalchemy/ext/mypy/__init__.py | 6 + .../mypy/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../mypy/__pycache__/apply.cpython-312.pyc | Bin 0 -> 10536 bytes .../__pycache__/decl_class.cpython-312.pyc | Bin 0 -> 15840 bytes .../mypy/__pycache__/infer.cpython-312.pyc | Bin 0 -> 15606 bytes .../mypy/__pycache__/names.cpython-312.pyc | Bin 0 -> 11056 bytes .../mypy/__pycache__/plugin.cpython-312.pyc | Bin 0 -> 12512 bytes .../ext/mypy/__pycache__/util.cpython-312.pyc | Bin 0 -> 14008 bytes .../sqlalchemy/ext/mypy/apply.py | 324 + .../sqlalchemy/ext/mypy/decl_class.py | 515 + .../sqlalchemy/ext/mypy/infer.py | 590 ++ .../sqlalchemy/ext/mypy/names.py | 335 + .../sqlalchemy/ext/mypy/plugin.py | 303 + .../site-packages/sqlalchemy/ext/mypy/util.py | 357 + .../sqlalchemy/ext/orderinglist.py | 427 + .../sqlalchemy/ext/serializer.py | 185 + .../sqlalchemy/future/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 471 bytes .../future/__pycache__/engine.cpython-312.pyc | Bin 0 -> 404 bytes .../site-packages/sqlalchemy/future/engine.py | 15 + .../site-packages/sqlalchemy/inspection.py | 174 + .../site-packages/sqlalchemy/log.py | 288 + .../site-packages/sqlalchemy/orm/__init__.py | 170 + .../orm/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6352 bytes .../_orm_constructors.cpython-312.pyc | Bin 0 -> 105408 bytes .../orm/__pycache__/_typing.cpython-312.pyc | Bin 0 -> 6811 bytes .../__pycache__/attributes.cpython-312.pyc | Bin 0 -> 99815 bytes .../orm/__pycache__/base.cpython-312.pyc | Bin 0 -> 30345 bytes .../bulk_persistence.cpython-312.pyc | Bin 0 -> 64341 bytes .../__pycache__/clsregistry.cpython-312.pyc | Bin 0 -> 23787 bytes .../__pycache__/collections.cpython-312.pyc | Bin 0 -> 61892 bytes .../orm/__pycache__/context.cpython-312.pyc | Bin 0 -> 100828 bytes .../orm/__pycache__/decl_api.cpython-312.pyc | Bin 0 -> 67358 bytes .../orm/__pycache__/decl_base.cpython-312.pyc | Bin 0 -> 68902 bytes .../__pycache__/dependency.cpython-312.pyc | Bin 0 -> 43346 bytes .../descriptor_props.cpython-312.pyc | Bin 0 -> 48890 bytes .../orm/__pycache__/dynamic.cpython-312.pyc | Bin 0 -> 12948 bytes .../orm/__pycache__/evaluator.cpython-312.pyc | Bin 0 -> 16768 bytes .../orm/__pycache__/events.cpython-312.pyc | Bin 0 -> 137167 bytes .../orm/__pycache__/exc.cpython-312.pyc | Bin 0 -> 9858 bytes .../orm/__pycache__/identity.cpython-312.pyc | Bin 0 -> 12620 bytes .../instrumentation.cpython-312.pyc | Bin 0 -> 31211 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 0 -> 54286 bytes .../orm/__pycache__/loading.cpython-312.pyc | Bin 0 -> 46917 bytes .../mapped_collection.cpython-312.pyc | Bin 0 -> 21893 bytes .../orm/__pycache__/mapper.cpython-312.pyc | Bin 0 -> 168863 bytes .../__pycache__/path_registry.cpython-312.pyc | Bin 0 -> 31480 bytes .../__pycache__/persistence.cpython-312.pyc | Bin 0 -> 48426 bytes .../__pycache__/properties.cpython-312.pyc | Bin 0 -> 32776 bytes .../orm/__pycache__/query.cpython-312.pyc | Bin 0 -> 128592 bytes .../__pycache__/relationships.cpython-312.pyc | Bin 0 -> 130392 bytes .../orm/__pycache__/scoping.cpython-312.pyc | Bin 0 -> 83606 bytes .../orm/__pycache__/session.cpython-312.pyc | Bin 0 -> 203513 bytes .../orm/__pycache__/state.cpython-312.pyc | Bin 0 -> 45132 bytes .../__pycache__/state_changes.cpython-312.pyc | Bin 0 -> 7027 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 0 -> 105129 bytes .../strategy_options.cpython-312.pyc | Bin 0 -> 86702 bytes .../orm/__pycache__/sync.cpython-312.pyc | Bin 0 -> 6616 bytes .../__pycache__/unitofwork.cpython-312.pyc | Bin 0 -> 34105 bytes .../orm/__pycache__/util.cpython-312.pyc | Bin 0 -> 84907 bytes .../orm/__pycache__/writeonly.cpython-312.pyc | Bin 0 -> 28841 bytes .../sqlalchemy/orm/_orm_constructors.py | 2590 +++++ .../site-packages/sqlalchemy/orm/_typing.py | 179 + .../sqlalchemy/orm/attributes.py | 2835 ++++++ .../site-packages/sqlalchemy/orm/base.py | 973 ++ .../sqlalchemy/orm/bulk_persistence.py | 2123 ++++ .../sqlalchemy/orm/clsregistry.py | 571 ++ .../sqlalchemy/orm/collections.py | 1627 ++++ .../site-packages/sqlalchemy/orm/context.py | 3268 +++++++ .../site-packages/sqlalchemy/orm/decl_api.py | 1917 ++++ .../site-packages/sqlalchemy/orm/decl_base.py | 2188 +++++ .../sqlalchemy/orm/dependency.py | 1304 +++ .../sqlalchemy/orm/descriptor_props.py | 1077 +++ .../site-packages/sqlalchemy/orm/dynamic.py | 300 + .../site-packages/sqlalchemy/orm/evaluator.py | 379 + .../site-packages/sqlalchemy/orm/events.py | 3271 +++++++ .../site-packages/sqlalchemy/orm/exc.py | 228 + .../site-packages/sqlalchemy/orm/identity.py | 302 + .../sqlalchemy/orm/instrumentation.py | 754 ++ .../sqlalchemy/orm/interfaces.py | 1490 +++ .../site-packages/sqlalchemy/orm/loading.py | 1682 ++++ .../sqlalchemy/orm/mapped_collection.py | 557 ++ .../site-packages/sqlalchemy/orm/mapper.py | 4430 +++++++++ .../sqlalchemy/orm/path_registry.py | 811 ++ .../sqlalchemy/orm/persistence.py | 1782 ++++ .../sqlalchemy/orm/properties.py | 877 ++ .../site-packages/sqlalchemy/orm/query.py | 3447 +++++++ .../sqlalchemy/orm/relationships.py | 3514 +++++++ .../site-packages/sqlalchemy/orm/scoping.py | 2163 +++++ .../site-packages/sqlalchemy/orm/session.py | 5302 ++++++++++ .../site-packages/sqlalchemy/orm/state.py | 1143 +++ .../sqlalchemy/orm/state_changes.py | 198 + .../sqlalchemy/orm/strategies.py | 3473 +++++++ .../sqlalchemy/orm/strategy_options.py | 2550 +++++ .../site-packages/sqlalchemy/orm/sync.py | 164 + .../sqlalchemy/orm/unitofwork.py | 796 ++ .../site-packages/sqlalchemy/orm/util.py | 2402 +++++ .../site-packages/sqlalchemy/orm/writeonly.py | 678 ++ .../site-packages/sqlalchemy/pool/__init__.py | 44 + .../pool/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1522 bytes .../pool/__pycache__/base.cpython-312.pyc | Bin 0 -> 56233 bytes .../pool/__pycache__/events.cpython-312.pyc | Bin 0 -> 14332 bytes .../pool/__pycache__/impl.cpython-312.pyc | Bin 0 -> 25934 bytes .../site-packages/sqlalchemy/pool/base.py | 1515 +++ .../site-packages/sqlalchemy/pool/events.py | 372 + .../site-packages/sqlalchemy/pool/impl.py | 581 ++ .../site-packages/sqlalchemy/py.typed | 0 .../site-packages/sqlalchemy/schema.py | 70 + .../site-packages/sqlalchemy/sql/__init__.py | 145 + .../sql/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4695 bytes .../_dml_constructors.cpython-312.pyc | Bin 0 -> 4003 bytes .../_elements_constructors.cpython-312.pyc | Bin 0 -> 65585 bytes .../__pycache__/_orm_types.cpython-312.pyc | Bin 0 -> 635 bytes .../sql/__pycache__/_py_util.cpython-312.pyc | Bin 0 -> 2971 bytes .../_selectable_constructors.cpython-312.pyc | Bin 0 -> 21498 bytes .../sql/__pycache__/_typing.cpython-312.pyc | Bin 0 -> 14812 bytes .../__pycache__/annotation.cpython-312.pyc | Bin 0 -> 21345 bytes .../sql/__pycache__/base.cpython-312.pyc | Bin 0 -> 97762 bytes .../sql/__pycache__/cache_key.cpython-312.pyc | Bin 0 -> 35596 bytes .../sql/__pycache__/coercions.cpython-312.pyc | Bin 0 -> 49030 bytes .../sql/__pycache__/compiler.cpython-312.pyc | Bin 0 -> 271613 bytes .../sql/__pycache__/crud.cpython-312.pyc | Bin 0 -> 45460 bytes .../sql/__pycache__/ddl.cpython-312.pyc | Bin 0 -> 56257 bytes .../default_comparator.cpython-312.pyc | Bin 0 -> 19491 bytes .../sql/__pycache__/dml.cpython-312.pyc | Bin 0 -> 73558 bytes .../sql/__pycache__/elements.cpython-312.pyc | Bin 0 -> 210521 bytes .../sql/__pycache__/events.cpython-312.pyc | Bin 0 -> 19230 bytes .../__pycache__/expression.cpython-312.pyc | Bin 0 -> 5157 bytes .../sql/__pycache__/functions.cpython-312.pyc | Bin 0 -> 75760 bytes .../sql/__pycache__/lambdas.cpython-312.pyc | Bin 0 -> 54849 bytes .../sql/__pycache__/naming.cpython-312.pyc | Bin 0 -> 8484 bytes .../sql/__pycache__/operators.cpython-312.pyc | Bin 0 -> 89878 bytes .../sql/__pycache__/roles.cpython-312.pyc | Bin 0 -> 12254 bytes .../sql/__pycache__/schema.cpython-312.pyc | Bin 0 -> 245446 bytes .../__pycache__/selectable.cpython-312.pyc | Bin 0 -> 260312 bytes .../sql/__pycache__/sqltypes.cpython-312.pyc | Bin 0 -> 151251 bytes .../__pycache__/traversals.cpython-312.pyc | Bin 0 -> 42411 bytes .../sql/__pycache__/type_api.cpython-312.pyc | Bin 0 -> 86511 bytes .../sql/__pycache__/util.cpython-312.pyc | Bin 0 -> 54382 bytes .../sql/__pycache__/visitors.cpython-312.pyc | Bin 0 -> 36074 bytes .../sqlalchemy/sql/_dml_constructors.py | 132 + .../sqlalchemy/sql/_elements_constructors.py | 1862 ++++ .../sqlalchemy/sql/_orm_types.py | 20 + .../site-packages/sqlalchemy/sql/_py_util.py | 75 + .../sql/_selectable_constructors.py | 637 ++ .../site-packages/sqlalchemy/sql/_typing.py | 460 + .../sqlalchemy/sql/annotation.py | 585 ++ .../site-packages/sqlalchemy/sql/base.py | 2182 +++++ .../site-packages/sqlalchemy/sql/cache_key.py | 1057 ++ .../site-packages/sqlalchemy/sql/coercions.py | 1405 +++ .../site-packages/sqlalchemy/sql/compiler.py | 7827 +++++++++++++++ .../site-packages/sqlalchemy/sql/crud.py | 1669 ++++ .../site-packages/sqlalchemy/sql/ddl.py | 1388 +++ .../sqlalchemy/sql/default_comparator.py | 552 ++ .../site-packages/sqlalchemy/sql/dml.py | 1819 ++++ .../site-packages/sqlalchemy/sql/elements.py | 5515 +++++++++++ .../site-packages/sqlalchemy/sql/events.py | 458 + .../sqlalchemy/sql/expression.py | 162 + .../site-packages/sqlalchemy/sql/functions.py | 2064 ++++ .../site-packages/sqlalchemy/sql/lambdas.py | 1443 +++ .../site-packages/sqlalchemy/sql/naming.py | 212 + .../site-packages/sqlalchemy/sql/operators.py | 2623 +++++ .../site-packages/sqlalchemy/sql/roles.py | 323 + .../site-packages/sqlalchemy/sql/schema.py | 6194 ++++++++++++ .../sqlalchemy/sql/selectable.py | 7089 ++++++++++++++ .../site-packages/sqlalchemy/sql/sqltypes.py | 3835 ++++++++ .../sqlalchemy/sql/traversals.py | 1024 ++ .../site-packages/sqlalchemy/sql/type_api.py | 2343 +++++ .../site-packages/sqlalchemy/sql/util.py | 1487 +++ .../site-packages/sqlalchemy/sql/visitors.py | 1167 +++ .../sqlalchemy/testing/__init__.py | 96 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3339 bytes .../__pycache__/assertions.cpython-312.pyc | Bin 0 -> 41859 bytes .../__pycache__/assertsql.cpython-312.pyc | Bin 0 -> 20220 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 0 -> 4159 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 17621 bytes .../__pycache__/engines.cpython-312.pyc | Bin 0 -> 21445 bytes .../__pycache__/entities.cpython-312.pyc | Bin 0 -> 4998 bytes .../__pycache__/exclusions.cpython-312.pyc | Bin 0 -> 21247 bytes .../__pycache__/pickleable.cpython-312.pyc | Bin 0 -> 6698 bytes .../__pycache__/profiling.cpython-312.pyc | Bin 0 -> 13022 bytes .../__pycache__/provision.cpython-312.pyc | Bin 0 -> 21226 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 86770 bytes .../__pycache__/schema.cpython-312.pyc | Bin 0 -> 8967 bytes .../testing/__pycache__/util.cpython-312.pyc | Bin 0 -> 21837 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 0 -> 2018 bytes .../sqlalchemy/testing/assertions.py | 989 ++ .../sqlalchemy/testing/assertsql.py | 516 + .../sqlalchemy/testing/asyncio.py | 135 + .../sqlalchemy/testing/config.py | 423 + .../sqlalchemy/testing/engines.py | 474 + .../sqlalchemy/testing/entities.py | 117 + .../sqlalchemy/testing/exclusions.py | 435 + .../sqlalchemy/testing/fixtures/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 920 bytes .../fixtures/__pycache__/base.cpython-312.pyc | Bin 0 -> 13345 bytes .../fixtures/__pycache__/mypy.cpython-312.pyc | Bin 0 -> 12861 bytes .../fixtures/__pycache__/orm.cpython-312.pyc | Bin 0 -> 11453 bytes .../fixtures/__pycache__/sql.cpython-312.pyc | Bin 0 -> 22499 bytes .../sqlalchemy/testing/fixtures/base.py | 366 + .../sqlalchemy/testing/fixtures/mypy.py | 312 + .../sqlalchemy/testing/fixtures/orm.py | 227 + .../sqlalchemy/testing/fixtures/sql.py | 503 + .../sqlalchemy/testing/pickleable.py | 155 + .../sqlalchemy/testing/plugin/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 209 bytes .../__pycache__/bootstrap.cpython-312.pyc | Bin 0 -> 2154 bytes .../__pycache__/plugin_base.cpython-312.pyc | Bin 0 -> 27850 bytes .../__pycache__/pytestplugin.cpython-312.pyc | Bin 0 -> 32887 bytes .../sqlalchemy/testing/plugin/bootstrap.py | 51 + .../sqlalchemy/testing/plugin/plugin_base.py | 779 ++ .../sqlalchemy/testing/plugin/pytestplugin.py | 868 ++ .../sqlalchemy/testing/profiling.py | 324 + .../sqlalchemy/testing/provision.py | 502 + .../sqlalchemy/testing/requirements.py | 1828 ++++ .../sqlalchemy/testing/schema.py | 224 + .../sqlalchemy/testing/suite/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 576 bytes .../__pycache__/test_cte.cpython-312.pyc | Bin 0 -> 9910 bytes .../__pycache__/test_ddl.cpython-312.pyc | Bin 0 -> 18744 bytes .../test_deprecations.cpython-312.pyc | Bin 0 -> 9047 bytes .../__pycache__/test_dialect.cpython-312.pyc | Bin 0 -> 34607 bytes .../__pycache__/test_insert.cpython-312.pyc | Bin 0 -> 25228 bytes .../test_reflection.cpython-312.pyc | Bin 0 -> 141398 bytes .../__pycache__/test_results.cpython-312.pyc | Bin 0 -> 25343 bytes .../__pycache__/test_rowcount.cpython-312.pyc | Bin 0 -> 10360 bytes .../__pycache__/test_select.cpython-312.pyc | Bin 0 -> 114380 bytes .../__pycache__/test_sequence.cpython-312.pyc | Bin 0 -> 14992 bytes .../__pycache__/test_types.cpython-312.pyc | Bin 0 -> 98804 bytes .../test_unicode_ddl.cpython-312.pyc | Bin 0 -> 7630 bytes .../test_update_delete.cpython-312.pyc | Bin 0 -> 7372 bytes .../sqlalchemy/testing/suite/test_cte.py | 211 + .../sqlalchemy/testing/suite/test_ddl.py | 389 + .../testing/suite/test_deprecations.py | 153 + .../sqlalchemy/testing/suite/test_dialect.py | 740 ++ .../sqlalchemy/testing/suite/test_insert.py | 630 ++ .../testing/suite/test_reflection.py | 3225 +++++++ .../sqlalchemy/testing/suite/test_results.py | 502 + .../sqlalchemy/testing/suite/test_rowcount.py | 258 + .../sqlalchemy/testing/suite/test_select.py | 1999 ++++ .../sqlalchemy/testing/suite/test_sequence.py | 317 + .../sqlalchemy/testing/suite/test_types.py | 2141 ++++ .../testing/suite/test_unicode_ddl.py | 189 + .../testing/suite/test_update_delete.py | 139 + .../site-packages/sqlalchemy/testing/util.py | 538 ++ .../sqlalchemy/testing/warnings.py | 52 + .../site-packages/sqlalchemy/types.py | 76 + .../site-packages/sqlalchemy/util/__init__.py | 160 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5687 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 31665 bytes .../_concurrency_py3k.cpython-312.pyc | Bin 0 -> 10845 bytes .../util/__pycache__/_has_cy.cpython-312.pyc | Bin 0 -> 1100 bytes .../_py_collections.cpython-312.pyc | Bin 0 -> 29214 bytes .../util/__pycache__/compat.cpython-312.pyc | Bin 0 -> 12486 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 0 -> 4052 bytes .../__pycache__/deprecations.cpython-312.pyc | Bin 0 -> 13652 bytes .../__pycache__/langhelpers.cpython-312.pyc | Bin 0 -> 84750 bytes .../__pycache__/preloaded.cpython-312.pyc | Bin 0 -> 5901 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 14633 bytes .../__pycache__/tool_support.cpython-312.pyc | Bin 0 -> 8730 bytes .../__pycache__/topological.cpython-312.pyc | Bin 0 -> 3947 bytes .../util/__pycache__/typing.cpython-312.pyc | Bin 0 -> 24404 bytes .../sqlalchemy/util/_collections.py | 715 ++ .../sqlalchemy/util/_concurrency_py3k.py | 288 + .../site-packages/sqlalchemy/util/_has_cy.py | 40 + .../sqlalchemy/util/_py_collections.py | 541 ++ .../site-packages/sqlalchemy/util/compat.py | 301 + .../sqlalchemy/util/concurrency.py | 108 + .../sqlalchemy/util/deprecations.py | 401 + .../sqlalchemy/util/langhelpers.py | 2222 +++++ .../sqlalchemy/util/preloaded.py | 150 + .../site-packages/sqlalchemy/util/queue.py | 322 + .../sqlalchemy/util/tool_support.py | 201 + .../sqlalchemy/util/topological.py | 120 + .../site-packages/sqlalchemy/util/typing.py | 689 ++ .../INSTALLER | 1 + .../LICENSE | 279 + .../METADATA | 67 + .../typing_extensions-4.12.2.dist-info/RECORD | 8 + .../REQUESTED | 0 .../typing_extensions-4.12.2.dist-info/WHEEL | 4 + .../site-packages/typing_extensions.py | 3641 +++++++ .../werkzeug-3.1.3.dist-info/INSTALLER | 1 + .../werkzeug-3.1.3.dist-info/LICENSE.txt | 28 + .../werkzeug-3.1.3.dist-info/METADATA | 99 + .../werkzeug-3.1.3.dist-info/RECORD | 117 + .../werkzeug-3.1.3.dist-info/REQUESTED | 0 .../werkzeug-3.1.3.dist-info/WHEEL | 4 + .../site-packages/werkzeug/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 346 bytes .../__pycache__/_internal.cpython-312.pyc | Bin 0 -> 9761 bytes .../__pycache__/_reloader.cpython-312.pyc | Bin 0 -> 20617 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33332 bytes .../__pycache__/formparser.cpython-312.pyc | Bin 0 -> 17032 bytes .../werkzeug/__pycache__/http.cpython-312.pyc | Bin 0 -> 50257 bytes .../__pycache__/local.cpython-312.pyc | Bin 0 -> 28487 bytes .../__pycache__/security.cpython-312.pyc | Bin 0 -> 7140 bytes .../__pycache__/serving.cpython-312.pyc | Bin 0 -> 46125 bytes .../werkzeug/__pycache__/test.cpython-312.pyc | Bin 0 -> 59876 bytes .../__pycache__/testapp.cpython-312.pyc | Bin 0 -> 8897 bytes .../werkzeug/__pycache__/urls.cpython-312.pyc | Bin 0 -> 8276 bytes .../__pycache__/user_agent.cpython-312.pyc | Bin 0 -> 2159 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 28150 bytes .../werkzeug/__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 25222 bytes .../site-packages/werkzeug/_internal.py | 211 + .../site-packages/werkzeug/_reloader.py | 471 + .../werkzeug/datastructures/__init__.py | 64 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2423 bytes .../__pycache__/accept.cpython-312.pyc | Bin 0 -> 15950 bytes .../__pycache__/auth.cpython-312.pyc | Bin 0 -> 14465 bytes .../__pycache__/cache_control.cpython-312.pyc | Bin 0 -> 12232 bytes .../__pycache__/csp.cpython-312.pyc | Bin 0 -> 6193 bytes .../__pycache__/etag.cpython-312.pyc | Bin 0 -> 5408 bytes .../__pycache__/file_storage.cpython-312.pyc | Bin 0 -> 8830 bytes .../__pycache__/headers.cpython-312.pyc | Bin 0 -> 30526 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 0 -> 16406 bytes .../__pycache__/range.cpython-312.pyc | Bin 0 -> 10058 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 59097 bytes .../werkzeug/datastructures/accept.py | 350 + .../werkzeug/datastructures/auth.py | 317 + .../werkzeug/datastructures/cache_control.py | 273 + .../werkzeug/datastructures/csp.py | 100 + .../werkzeug/datastructures/etag.py | 106 + .../werkzeug/datastructures/file_storage.py | 209 + .../werkzeug/datastructures/headers.py | 662 ++ .../werkzeug/datastructures/mixins.py | 317 + .../werkzeug/datastructures/range.py | 214 + .../werkzeug/datastructures/structures.py | 1239 +++ .../site-packages/werkzeug/debug/__init__.py | 565 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 23482 bytes .../debug/__pycache__/console.cpython-312.pyc | Bin 0 -> 11643 bytes .../debug/__pycache__/repr.cpython-312.pyc | Bin 0 -> 13816 bytes .../debug/__pycache__/tbtools.cpython-312.pyc | Bin 0 -> 17015 bytes .../site-packages/werkzeug/debug/console.py | 219 + .../site-packages/werkzeug/debug/repr.py | 282 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 344 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 450 + .../site-packages/werkzeug/exceptions.py | 894 ++ .../site-packages/werkzeug/formparser.py | 430 + .../python3.12/site-packages/werkzeug/http.py | 1405 +++ .../site-packages/werkzeug/local.py | 653 ++ .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 0 -> 3321 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 0 -> 9413 bytes .../__pycache__/lint.cpython-312.pyc | Bin 0 -> 17783 bytes .../__pycache__/profiler.cpython-312.pyc | Bin 0 -> 7207 bytes .../__pycache__/proxy_fix.cpython-312.pyc | Bin 0 -> 7204 bytes .../__pycache__/shared_data.cpython-312.pyc | Bin 0 -> 12759 bytes .../werkzeug/middleware/dispatcher.py | 81 + .../werkzeug/middleware/http_proxy.py | 236 + .../site-packages/werkzeug/middleware/lint.py | 439 + .../werkzeug/middleware/profiler.py | 155 + .../werkzeug/middleware/proxy_fix.py | 183 + .../werkzeug/middleware/shared_data.py | 283 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 134 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4676 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 10916 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7919 bytes .../routing/__pycache__/map.cpython-312.pyc | Bin 0 -> 39839 bytes .../__pycache__/matcher.cpython-312.pyc | Bin 0 -> 8287 bytes .../routing/__pycache__/rules.cpython-312.pyc | Bin 0 -> 39175 bytes .../werkzeug/routing/converters.py | 261 + .../werkzeug/routing/exceptions.py | 152 + .../site-packages/werkzeug/routing/map.py | 951 ++ .../site-packages/werkzeug/routing/matcher.py | 202 + .../site-packages/werkzeug/routing/rules.py | 928 ++ .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 199 bytes .../sansio/__pycache__/http.cpython-312.pyc | Bin 0 -> 5650 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 0 -> 14058 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 21892 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 31747 bytes .../sansio/__pycache__/utils.cpython-312.pyc | Bin 0 -> 6189 bytes .../site-packages/werkzeug/sansio/http.py | 170 + .../werkzeug/sansio/multipart.py | 323 + .../site-packages/werkzeug/sansio/request.py | 534 + .../site-packages/werkzeug/sansio/response.py | 763 ++ .../site-packages/werkzeug/sansio/utils.py | 167 + .../site-packages/werkzeug/security.py | 166 + .../site-packages/werkzeug/serving.py | 1125 +++ .../python3.12/site-packages/werkzeug/test.py | 1464 +++ .../site-packages/werkzeug/testapp.py | 194 + .../python3.12/site-packages/werkzeug/urls.py | 203 + .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 691 ++ .../werkzeug/wrappers/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 323 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 26153 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 34578 bytes .../werkzeug/wrappers/request.py | 650 ++ .../werkzeug/wrappers/response.py | 831 ++ .../python3.12/site-packages/werkzeug/wsgi.py | 595 ++ .../MiniProjects/QuizMaster/venv/pyvenv.cfg | 5 + 2852 files changed, 535145 insertions(+) create mode 100644 Domains/FullStack/MiniProjects/.DS_Store create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/.DS_Store create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/Procfile create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/README.md create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/__pycache__/app.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/__pycache__/models.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/app.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/controller/.DS_Store create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/controller/__pycache__/api.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/controller/__pycache__/config.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/controller/__pycache__/routes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/controller/api.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/controller/config.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/controller/routes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/instance/db.sqlite3 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/models.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/requirements.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/run_app.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/swagger_subject_chapter_api.yaml create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/admin.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/add.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/delete.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/edit.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/index.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/layout.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/login.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/messages.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/navbar.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/profile.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/question/add.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/question/delete.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/question/edit.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/quiz.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/add.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/delete.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/details.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/edit.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/start.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/view.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/register.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/scores/quiz_details.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/scores/score.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/search/search_results.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/search/subject_details.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/search/user_details.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/subject/add.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/subject/delete.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/subject/edit.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/summary/admin_summary.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/templates/summary/user_summary.html create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/Activate.ps1 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.csh create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.fish create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/dotenv create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/flask create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/gunicorn create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3 create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3.12 create mode 120000 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python create mode 120000 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3 create mode 120000 Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3.12 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/AUTHORS.md create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/date.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/decimalfraction.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/duration.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/interval.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/resolution.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/time.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/timezone.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/utcoffset.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__pycache__/python.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/python.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/test_init.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/test_python.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_init.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_python.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/date.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/decimalfraction.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/duration.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/interval.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/resolution.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_date.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_decimalfraction.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_duration.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_init.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_interval.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_time.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_timezone.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/__pycache__/test_utcoffset.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_date.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_decimalfraction.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_duration.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_init.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_interval.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_time.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_timezone.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/tests/test_utcoffset.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/time.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/timezone.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/utcoffset.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker/_utilities.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/blinker/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click-8.1.8.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click-8.1.8.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click-8.1.8.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click-8.1.8.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click-8.1.8.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click-8.1.8.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_termui_impl.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_textwrap.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_winconsole.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/core.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/decorators.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/formatting.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/globals.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/shell_completion.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/termui.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/testing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/cli.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/ipython.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/main.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/variables.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/version.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/entry_points.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/app.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/blueprints.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/cli.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/config.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/ctx.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/debughelpers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/globals.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/helpers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/provider.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/tag.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/logging.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/README.md create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/app.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sessions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/signals.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/templating.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/testing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/typing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/views.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/wrappers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/__version__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/fields.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/inputs.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/reqparse.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__version__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/fields.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/inputs.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__pycache__/json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/reqparse.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__pycache__/cors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__pycache__/crypto.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/cors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/crypto.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/model.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/pagination.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/query.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/session.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/table.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/cli.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/extension.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/model.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/pagination.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/query.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/record_queries.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/session.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/table.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/track_modifications.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/arbiter.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/config.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/debug.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/errors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/glogging.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/pidfile.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/reloader.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/sock.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/systemd.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/wsgiapp.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/pasterapp.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/wsgiapp.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/arbiter.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/config.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/debug.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/errors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/glogging.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/body.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/errors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/message.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/unreader.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/wsgi.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/body.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/errors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/message.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/unreader.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/wsgi.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__pycache__/statsd.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/statsd.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/pidfile.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/reloader.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/sock.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/systemd.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/base_async.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/geventlet.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/ggevent.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/gthread.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/sync.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/workertmp.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base_async.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/geventlet.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/ggevent.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gthread.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gtornado.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/sync.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/workertmp.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/_json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/encoding.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/exc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/serializer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/signer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/timed.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/entry_points.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/_identifier.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/async_utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/bccache.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/compiler.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/constants.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/debug.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/defaults.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/environment.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/ext.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/filters.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/idtracking.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/lexer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/loaders.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/meta.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/nativetypes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/nodes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/optimizer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/runtime.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/sandbox.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/tests.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/visitor.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/__pycache__/_native.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/_native.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/_speedups.c create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/_speedups.cpython-312-darwin.so create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/_speedups.pyi create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/markupsafe/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/licenses/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/licenses/LICENSE.APACHE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging-25.0.dist-info/licenses/LICENSE.BSD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/_elffile.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/_manylinux.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/_musllinux.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/_parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/_structures.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/_tokenizer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/licenses/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/licenses/_spdx.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/markers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/metadata.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/requirements.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/specifiers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/tags.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/packaging/version.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/AUTHORS.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/entry_points.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libcom_err.3.0.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libcrypto.3.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libgssapi_krb5.2.2.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libintl.8.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libk5crypto.3.1.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libkrb5.3.3.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libkrb5support.1.1.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libpq.5.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/.dylibs/libssl.3.dylib create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/_ipaddress.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/_json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/_range.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/errorcodes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/errors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/extensions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/extras.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/pool.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/sql.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/__pycache__/tz.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/_ipaddress.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/_json.py create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/_psycopg.cpython-312-darwin.so create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/_range.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/errorcodes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/errors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/extensions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/extras.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/pool.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/sql.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2/tz.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/psycopg2_binary-2.9.10.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/entry_points.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz-2025.1.dist-info/zip-safe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/__pycache__/lazy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/__pycache__/reference.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/__pycache__/tzfile.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/__pycache__/tzinfo.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/lazy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/reference.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/tzfile.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/tzinfo.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Abidjan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Accra create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Algiers create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Asmara create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Asmera create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bamako create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bangui create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Banjul create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bissau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Blantyre create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Brazzaville create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bujumbura create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Cairo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Casablanca create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Ceuta create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Conakry create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Dakar create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Djibouti create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Douala create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/El_Aaiun create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Freetown create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Gaborone create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Harare create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Johannesburg create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Juba create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Kampala create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Khartoum create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Kigali create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Kinshasa create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lagos create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Libreville create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lome create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Luanda create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lubumbashi create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lusaka create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Malabo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Maputo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Maseru create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Mbabane create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Mogadishu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Monrovia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Nairobi create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Ndjamena create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Niamey create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Nouakchott create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Ouagadougou create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Porto-Novo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Sao_Tome create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Timbuktu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Tripoli create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Tunis create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Africa/Windhoek create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Adak create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Anchorage create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Anguilla create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Antigua create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Araguaina create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Salta create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Aruba create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Asuncion create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Atikokan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Atka create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Bahia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Bahia_Banderas create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Barbados create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Belem create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Belize create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Blanc-Sablon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Boa_Vista create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Bogota create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Boise create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Buenos_Aires create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Cambridge_Bay create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Campo_Grande create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Cancun create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Caracas create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Catamarca create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Cayenne create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Cayman create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Chicago create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Chihuahua create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Ciudad_Juarez create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Coral_Harbour create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Cordoba create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Costa_Rica create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Creston create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Cuiaba create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Curacao create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Danmarkshavn create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Dawson create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Dawson_Creek create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Denver create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Detroit create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Dominica create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Edmonton create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Eirunepe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/El_Salvador create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Ensenada create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Fort_Nelson create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Fort_Wayne create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Fortaleza create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Glace_Bay create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Godthab create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Goose_Bay create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Grand_Turk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Grenada create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Guadeloupe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Guatemala create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Guayaquil create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Guyana create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Halifax create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Havana create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Hermosillo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Knox create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Marengo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Vevay create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Winamac create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Indianapolis create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Inuvik create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Iqaluit create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Jamaica create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Jujuy create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Juneau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Knox_IN create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Kralendijk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/La_Paz create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Lima create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Los_Angeles create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Louisville create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Lower_Princes create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Maceio create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Managua create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Manaus create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Marigot create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Martinique create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Matamoros create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Mazatlan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Mendoza create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Menominee create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Merida create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Metlakatla create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Mexico_City create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Miquelon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Moncton create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Monterrey create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Montevideo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Montreal create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Montserrat create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Nassau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/New_York create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Nipigon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Nome create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Noronha create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/North_Dakota/Center create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Nuuk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Ojinaga create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Panama create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Pangnirtung create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Paramaribo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Phoenix create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Port-au-Prince create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Port_of_Spain create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Porto_Acre create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Porto_Velho create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Puerto_Rico create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Punta_Arenas create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Rainy_River create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Rankin_Inlet create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Recife create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Regina create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Resolute create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Rio_Branco create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Rosario create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Santa_Isabel create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Santarem create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Santiago create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Santo_Domingo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Sao_Paulo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Scoresbysund create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Shiprock create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Sitka create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/St_Barthelemy create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/St_Johns create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/St_Kitts create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/St_Lucia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/St_Thomas create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/St_Vincent create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Swift_Current create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Tegucigalpa create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Thule create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Thunder_Bay create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Tijuana create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Toronto create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Tortola create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Vancouver create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Virgin create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Whitehorse create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Winnipeg create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Yakutat create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/America/Yellowknife create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Casey create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Davis create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Macquarie create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Mawson create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/McMurdo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Palmer create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Rothera create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/South_Pole create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Syowa create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Troll create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Vostok create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Aden create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Almaty create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Amman create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Anadyr create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Aqtau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Aqtobe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ashgabat create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ashkhabad create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Atyrau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Baghdad create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Bahrain create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Baku create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Bangkok create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Barnaul create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Beirut create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Bishkek create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Brunei create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Calcutta create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Choibalsan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Chongqing create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Chungking create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Colombo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dacca create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Damascus create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dhaka create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dili create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dubai create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dushanbe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Famagusta create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Gaza create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Harbin create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Hebron create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Hong_Kong create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Hovd create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Irkutsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Istanbul create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Jakarta create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Jayapura create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Jerusalem create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kabul create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kamchatka create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Karachi create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kashgar create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kathmandu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Katmandu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Khandyga create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kolkata create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kuching create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kuwait create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Macao create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Macau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Magadan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Makassar create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Manila create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Muscat create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Nicosia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Novosibirsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Omsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Oral create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Pontianak create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Pyongyang create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Qatar create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Qostanay create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Qyzylorda create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Rangoon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Riyadh create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Saigon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Sakhalin create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Samarkand create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Seoul create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Shanghai create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Singapore create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Taipei create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tashkent create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tbilisi create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tehran create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Thimbu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Thimphu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tokyo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tomsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Urumqi create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ust-Nera create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Vientiane create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Vladivostok create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yakutsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yangon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yerevan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Azores create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Bermuda create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Canary create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Faeroe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Faroe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Madeira create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/St_Helena create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Stanley create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/ACT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Adelaide create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Brisbane create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Broken_Hill create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Canberra create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Currie create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Darwin create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Eucla create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Hobart create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/LHI create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Lindeman create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Lord_Howe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Melbourne create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/NSW create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/North create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Perth create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Queensland create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/South create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Sydney create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Tasmania create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Victoria create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/West create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Australia/Yancowinna create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Brazil/Acre create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Brazil/DeNoronha create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Brazil/East create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Brazil/West create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/CET create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/CST6CDT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Atlantic create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Central create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Eastern create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Mountain create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Newfoundland create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Pacific create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Saskatchewan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Canada/Yukon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Chile/Continental create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Chile/EasterIsland create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Cuba create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/EET create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/EST create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/EST5EDT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Egypt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Eire create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+0 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+1 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+10 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+11 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+12 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+2 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+3 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+4 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+5 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+6 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+7 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+8 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+9 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-0 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-1 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-10 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-11 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-12 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-13 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-14 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-2 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-3 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-4 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-5 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-6 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-7 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-8 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-9 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT0 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/Greenwich create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/UCT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/UTC create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/Universal create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Etc/Zulu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Amsterdam create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Andorra create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Astrakhan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Athens create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Belfast create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Belgrade create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Berlin create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Bratislava create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Brussels create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Bucharest create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Budapest create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Busingen create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Chisinau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Copenhagen create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Dublin create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Gibraltar create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Guernsey create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Helsinki create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Istanbul create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Jersey create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kaliningrad create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kiev create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kirov create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kyiv create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Lisbon create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Ljubljana create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/London create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Luxembourg create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Madrid create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Malta create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Mariehamn create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Minsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Monaco create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Moscow create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Nicosia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Oslo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Paris create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Podgorica create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Prague create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Riga create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Rome create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Samara create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/San_Marino create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Sarajevo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Saratov create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Simferopol create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Skopje create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Sofia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Stockholm create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Tallinn create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Tirane create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Tiraspol create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Ulyanovsk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Uzhgorod create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vaduz create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vatican create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vienna create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vilnius create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Volgograd create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Warsaw create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Zagreb create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Zaporozhye create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Europe/Zurich create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Factory create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/GB create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/GB-Eire create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/GMT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/GMT+0 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/GMT-0 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/GMT0 create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Greenwich create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/HST create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Hongkong create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Iceland create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Antananarivo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Chagos create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Christmas create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Cocos create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Comoro create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Kerguelen create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Mahe create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Maldives create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Mauritius create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Mayotte create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Indian/Reunion create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Iran create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Israel create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Jamaica create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Japan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Kwajalein create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Libya create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/MET create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/MST create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/MST7MDT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Mexico/BajaNorte create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Mexico/BajaSur create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Mexico/General create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/NZ create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/NZ-CHAT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Navajo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/PRC create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/PST8PDT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Apia create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Auckland create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Chatham create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Chuuk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Easter create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Efate create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Enderbury create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Fakaofo create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Fiji create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Funafuti create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Galapagos create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Gambier create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Guam create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Honolulu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Johnston create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kanton create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kiritimati create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kosrae create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kwajalein create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Majuro create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Marquesas create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Midway create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Nauru create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Niue create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Norfolk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Noumea create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Palau create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Pitcairn create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Pohnpei create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Ponape create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Rarotonga create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Saipan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Samoa create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Tahiti create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Tarawa create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Tongatapu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Truk create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Wake create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Wallis create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Yap create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Poland create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Portugal create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/ROC create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/ROK create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Singapore create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Turkey create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/UCT create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Alaska create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Aleutian create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Arizona create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Central create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/East-Indiana create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Eastern create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Hawaii create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Indiana-Starke create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Michigan create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Mountain create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Pacific create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/US/Samoa create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/UTC create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Universal create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/W-SU create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/WET create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/Zulu create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/iso3166.tab create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/leapseconds create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/tzdata.zi create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/zone.tab create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/zone1970.tab create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/pytz/zoneinfo/zonenow.tab create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six-1.17.0.dist-info/top_level.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/six.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/events.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/exc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/inspection.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/log.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/schema.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/aioodbc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/asyncio.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/aioodbc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/asyncio.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/connectors/pyodbc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/collections.cpython-312-darwin.so create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/collections.pyx create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.cpython-312-darwin.so create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.pxd create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.pyx create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/processors.cpython-312-darwin.so create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/processors.pyx create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/resultproxy.cpython-312-darwin.so create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/resultproxy.pyx create mode 100755 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/util.cpython-312-darwin.so create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/util.pyx create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/_typing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/_typing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/aioodbc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/aioodbc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/information_schema.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/provision.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/pymssql.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/pyodbc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/aiomysql.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/asyncmy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/cymysql.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/dml.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/expression.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadb.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/provision.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/pymysql.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/pyodbc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/reflection.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/reserved_words.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__pycache__/types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/dictionary.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/oracledb.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/array.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/dml.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ext.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/hstore.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/named_types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/operators.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/pg8000.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/provision.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ranges.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/json.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/dml.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/json.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/dialects/type_migration_guidelines.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_row.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/create.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/default.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/events.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/result.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/row.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/url.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/_py_processors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/_py_row.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/_py_util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/characteristics.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/create.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/events.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/interfaces.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/mock.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/processors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/row.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/strategies.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/url.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/engine/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/api.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/attr.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/registry.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/api.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/event/registry.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/events.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/exc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/baked.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/horizontal_shard.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__pycache__/engine.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__pycache__/exc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__pycache__/result.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__pycache__/session.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/exc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/result.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/scoping.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/baked.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/compiler.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/extensions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/hybrid.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/indexable.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/instrumentation.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mutable.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__pycache__/apply.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__pycache__/infer.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__pycache__/names.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/names.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/orderinglist.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/future/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/engine.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/future/engine.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/inspection.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/log.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/context.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/events.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/query.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/session.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/_orm_constructors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/_typing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/descriptor_props.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/dynamic.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/evaluator.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/events.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/exc.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/mapped_collection.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/properties.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/query.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/scoping.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/sync.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/orm/writeonly.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/events.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/events.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/schema.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_py_util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/events.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/_dml_constructors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/_elements_constructors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/_orm_types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/_py_util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/_selectable_constructors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/_typing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/annotation.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/default_comparator.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/events.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/expression.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/functions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/naming.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/operators.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/roles.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/assertsql.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/asyncio.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/config.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/pickleable.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/profiling.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/provision.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/requirements.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/schema.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/util.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/__pycache__/warnings.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/asyncio.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/config.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/entities.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__pycache__/base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__pycache__/orm.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__pycache__/sql.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/mypy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/orm.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/pickleable.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/bootstrap.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/plugin_base.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/pytestplugin.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/profiling.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/provision.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/requirements.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/schema.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_insert.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_types.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_cte.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_deprecations.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_rowcount.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_select.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_sequence.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/testing/warnings.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/types.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_py_collections.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/compat.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/queue.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/tool_support.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/topological.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/typing.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/_collections.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/_has_cy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/_py_collections.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/compat.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/concurrency.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/preloaded.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/queue.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/topological.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/sqlalchemy/util/typing.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/LICENSE create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/typing_extensions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/INSTALLER create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/LICENSE.txt create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/METADATA create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/RECORD create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/REQUESTED create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug-3.1.3.dist-info/WHEEL create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/http.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/local.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/security.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/test.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/testapp.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/_internal.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/_reloader.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/accept.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/auth.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/cache_control.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/csp.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/etag.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/headers.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/mixins.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/datastructures/structures.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/console.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/repr.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/shared/console.png create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/shared/less.png create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/shared/more.png create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/shared/style.css create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/debug/tbtools.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/formparser.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/http.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/local.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/lint.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/lint.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/profiler.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/middleware/shared_data.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/py.typed create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/converters.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/exceptions.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/map.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/matcher.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/routing/rules.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/http.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/multipart.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/request.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/response.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/sansio/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/security.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/serving.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/test.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/testapp.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/urls.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/user_agent.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/utils.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/wrappers/__init__.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/wrappers/request.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/wrappers/response.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/werkzeug/wsgi.py create mode 100644 Domains/FullStack/MiniProjects/QuizMaster/venv/pyvenv.cfg diff --git a/Domains/FullStack/MiniProjects/.DS_Store b/Domains/FullStack/MiniProjects/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7280eb49bee89a5a2c244f6c878825d2e053bc18 GIT binary patch literal 6148 zcmeHK!EVz)5S>j!<4}QeC{iy-D{+lV8c?f>i%DCg9yow2H~&X1_b z(z5FHeu~Cg^Uiw9Yk3>qhv1W%231&1%0W1O$GsD!vgj%fqc>?X9dHC@Q~ms(RR<`6?{W*s~(?&ah|FC4D-yrPbXTdk=86ne8#F_jS4E3wBwpL z*9~1~P64NYQ@|=<-$vesQ^YCY6mSYGDZuXs31{>z)&}*f1C2fc0Gk-rhL}GZnIkRw z7Hfl;feAwe8mh2I3}NUPmp0G0SQ|8S687*R?3IN*p$L6-)R#J)gm2KbP64ODq5^BC z+u{BH==bOUMUv||1)Ku^l>(x97#t4pm+aoU^5=N3mGF;nHqNUJUQ-b0tr)qy6>q_{ aVO(+m^exr~F#>ZR0$K*wI0gQy0>1!1QHomt literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/.DS_Store b/Domains/FullStack/MiniProjects/QuizMaster/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..02f5ab6c7b4781b5bc9b51982bef988bd3fddebc GIT binary patch literal 8196 zcmeHML2uJA6n@^ymTp4o0Z=bUk+@c6Y%o-DDP=owKtd~m1E7$!VGB!>(xffZRHeTS$_L>4k*X%oeq#QmIS z(u!`m0Tkd9wa7(2BA=WYYtvv9FbWt2i~>dhqrfsKfHRwuwcy-Wy{0q@7zO@I1$ck3 zks0e6#|q`vfkK7=zyg|OLLG5{tZN)ARCE%G zPC`Ff=mivlQ?KrZ$a@7QKbW@Wp9mSJ=a|$`_OS=- z(Gy@5&udRJ?{L?`Qyr8?a=cXc^ZE@iqZ71tD4d>?VE@XFU&I*vCS54z%6gJx zu+G0=T)a=7%MLk5i=0;$XaKb$8cb^>eJiWc#O{(PGkKq!9&nANN~>x%Wsd*%7k~d> zsyUm<7zK<1=c|Ay>^1iq81w88;{5O&Yum_gkU6p4SfQk#kl{E`hU37=KMYZ~ValAk e#<4=QApP|Z0p|Qap9smE|Lnf=V#j~t{Qn7vtD#!} literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/Procfile b/Domains/FullStack/MiniProjects/QuizMaster/Procfile new file mode 100644 index 00000000..8001d1a5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/Procfile @@ -0,0 +1 @@ +web: gunicorn app:app \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/README.md b/Domains/FullStack/MiniProjects/QuizMaster/README.md new file mode 100644 index 00000000..7f2c0c3e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/README.md @@ -0,0 +1,23 @@ +# Quiz Master application +**Contributor:** ekxnsh22005 + + +The following project is a quizmaster app that has an admin dashboard and user dashboard. + +The admin dashboard is hardcoded with the username and password as "admin" + +The admin can perform the following actions: +1. Add Subject +2. Add Chapter under Subject +3. Add Quiz with timer and MCQs and caqn set the date +4. Add Questions for the quiz +5. Search for users and see their history +6. See some graphical statistics about the users + +The user can perform the following actions: +1. Attempt quiz +2. View quiz history +3. Analyze the right and wrong options +4. See some graphical statistics + +The following website is built using HTML, CSS (Bootstrap), Flask and SQLite. \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/__pycache__/app.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e76f1a06650781013b3fe35b08c3ef20306e886e GIT binary patch literal 558 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 current_time).all() + available_quizzes = Quiz.query.filter( + Quiz.date_of_quiz <= current_time, + Quiz.id.notin_(attempted_quiz_ids) + ).all() + attempted_quizzes = Quiz.query.filter(Quiz.id.in_(attempted_quiz_ids)).all() + + quiz_question_counts = {} + for quiz in available_quizzes + upcoming_quizzes + attempted_quizzes: + quiz_question_counts[quiz.id] = Question.query.filter_by(quiz_id=quiz.id).count() + + return render_template( + 'index.html', + available_quizzes=available_quizzes, + upcoming_quizzes=upcoming_quizzes, + attempted_quizzes=attempted_quizzes, + user=user, + quiz_question_counts=quiz_question_counts + ) + + +@app.route('/login') +def login(): + return render_template('login.html') + +@app.route('/login', methods=['POST']) +def login_user(): + username = request.form['username'] + password = request.form['password'] + if not username or not password: + flash("Please fill out all these fields") + return redirect(url_for('login')) + + user = User.query.filter_by(username=username).first() + if not user: + flash("Username does not exist") + return redirect(url_for('login')) + + if not check_password_hash(user.passhash, password): + flash("Invalid password") + return redirect(url_for('login')) + + session['user_id'] = user.id + session['is_admin'] = user.is_admin + if user.is_admin: + return redirect(url_for('admin')) + else: + return redirect(url_for('index')) + + +@app.route('/register') +def register(): + return render_template('register.html') + +@app.route('/register', methods=['POST']) +def register_user(): + name = request.form['name'] + username = request.form['username'] + password = request.form['password'] + confirm_password = request.form['confirm_password'] + if not username or not password or not confirm_password or not name: + flash("Please fill out all these fields") + return redirect(url_for('register')) + + if password != confirm_password: + flash("Passwords do not match") + return redirect(url_for('register')) + + user = User.query.filter_by(username=username).first() + if user: + flash("Username already exists") + return redirect(url_for('register')) + + password_hash = generate_password_hash(password) + + new_user = User(username=username, passhash=password_hash, name=name) + db.session.add(new_user) + db.session.commit() + return redirect(url_for('login')) + +@app.route('/profile') +@auth_required +def profile(): + user = User.query.get(session['user_id']) + return render_template('profile.html', user=user) + +@app.route('/profile', methods=['POST']) +@auth_required +def profile_post(): + name = request.form['name'] + username = request.form['username'] + cpassword = request.form['cpassword'] + password = request.form['password'] + + if not username or not cpassword or not password: + flash("Please fill out all the required fields") + return redirect(url_for('profile')) + + user = User.query.get(session['user_id']) + if not check_password_hash(user.passhash, cpassword): + flash("Current password is incorrect") + return redirect(url_for('profile')) + + if username != user.username: + new_username = User.query.filter_by(username=username).first() + if new_username: + flash("Username already exists") + return redirect(url_for('profile')) + + new_password_hash = generate_password_hash(password) + user.name = name + user.username = username + user.passhash = new_password_hash + db.session.commit() + flash("Profile updated successfully") + return redirect(url_for('profile')) + +@app.route('/admin/profile') +@admin_required +def admin_profile(): + user = User.query.get(session['user_id']) + return render_template('profile.html', user=user) + +@app.route('/admin/profile', methods=['POST']) +@admin_required +def admin_profile_post(): + name = request.form['name'] + username = request.form['username'] + cpassword = request.form['cpassword'] + password = request.form['password'] + + if not username or not cpassword or not password: + flash("Please fill out all the required fields") + return redirect(url_for('admin_profile')) + + user = User.query.get(session['user_id']) + if not check_password_hash(user.passhash, cpassword): + flash("Current password is incorrect") + return redirect(url_for('admin_profile')) + + if username != user.username: + new_username = User.query.filter_by(username=username).first() + if new_username: + flash("Username already exists") + return redirect(url_for('admin_profile')) + + new_password_hash = generate_password_hash(password) + user.name = name + user.username = username + user.passhash = new_password_hash + db.session.commit() + flash("Profile updated successfully") + return redirect(url_for('admin_profile')) + + +@app.route('/logout') +@auth_required +def logout(): + session.pop('user_id') + flash("Logged out successfully") + return redirect(url_for('login')) + +@app.route('/admin/logout') +@admin_required +def admin_logout(): + session.pop('user_id') + flash("Logged out successfully") + return redirect(url_for('login')) + + +@app.route('/admin') +@admin_required +def admin(): + subjects = Subject.query.all() + return render_template('admin.html', subjects=subjects) + +@app.route('/admin/subject/add') +@admin_required +def add_subject(): + return render_template('subject/add.html') + +@app.route('/admin/subject/add', methods=['POST']) +@admin_required +def add_subject_post(): + name = request.form['name'] + description = request.form['description'] + if not name: + flash("Please fill out the subject name") + return redirect(url_for('add_subject')) + subject = Subject.query.filter_by(subject_name=name).first() + if subject: + flash("Subject already exists") + return redirect(url_for('add_subject')) + new_subject = Subject(subject_name=name, subject_description=description) + db.session.add(new_subject) + db.session.commit() + flash("Subject added successfully") + return redirect(url_for('admin')) + +@app.route('/admin/chapter/add/') +@admin_required +def add_chapter(subject_id): + subject = Subject.query.get(subject_id) + if not subject: + flash("Subject does not exist") + return redirect(url_for('admin')) + return render_template('chapter/add.html', subject=subject) + +@app.route('/admin/chapter/add/', methods=['POST']) +@admin_required +def add_chapter_post(subject_id): + name = request.form['name'] + description = request.form['description'] + if not name or not subject_id: + flash("Please fill out the chapter name") + return redirect(url_for('add_chapter', subject_id=subject_id)) + chapter = Chapter.query.filter_by(chapter_name=name, subject_id=subject_id).first() + if chapter: + flash("Chapter already exists") + return redirect(url_for('add_chapter')) + new_chapter = Chapter(chapter_name=name, chapter_description=description, subject_id=subject_id) + db.session.add(new_chapter) + db.session.commit() + flash("Chapter added successfully") + return redirect(url_for('admin')) + +@app.route('/admin/chapter//edit') +@admin_required +def edit_chapter(chapter_id): + chapter = Chapter.query.get(chapter_id) + if not chapter: + flash("Chapter does not exist") + return redirect(url_for('admin')) + return render_template('chapter/edit.html', chapter=chapter) + +@app.route('/admin/chapter//edit', methods=['POST']) +@admin_required +def edit_chapter_post(chapter_id): + chapter = Chapter.query.get(chapter_id) + if not chapter: + flash("Chapter does not exist") + return redirect(url_for('admin')) + name = request.form['name'] + description = request.form['description'] + if not name: + flash("Please fill out the chapter name") + return redirect(url_for('edit_chapter', id=id)) + chapter.chapter_name = name + chapter.chapter_description = description + db.session.commit() + flash("Chapter updated successfully") + return redirect(url_for('admin')) + +@app.route('/admin/chapter//delete') +@admin_required +def delete_chapter(chapter_id): + chapter = Chapter.query.get(chapter_id) + if not chapter: + flash("Chapter does not exist") + return redirect(url_for('admin')) + return render_template('chapter/delete.html', chapter=chapter) + +@app.route('/admin/chapter//delete', methods=['POST']) +@admin_required +def delete_chapter_post(chapter_id): + chapter = Chapter.query.get(chapter_id) + if not chapter: + flash("Chapter does not exist") + return redirect(url_for('admin')) + db.session.delete(chapter) + db.session.commit() + flash("Chapter deleted successfully") + return redirect(url_for('admin')) + +@app.route('/admin/subject//edit') +@admin_required +def edit_subject(id): + subject = Subject.query.get(id) + if not subject: + flash("Subject does not exist") + return redirect(url_for('admin')) + return render_template('subject/edit.html', subject=subject) + +@app.route('/admin/subject//edit', methods=['POST']) +@admin_required +def edit_subject_post(id): + subject = Subject.query.get(id) + if not subject: + flash("Subject does not exist") + return redirect(url_for('admin')) + name = request.form['name'] + description = request.form['description'] + if not name: + flash("Please fill out the subject name") + return redirect(url_for('edit_subject', id=id)) + subject.subject_name = name + subject.subject_description = description + db.session.commit() + flash("Subject updated successfully") + return redirect(url_for('admin')) + +@app.route('/admin/subject//delete') +@admin_required +def delete_subject(id): + subject = Subject.query.get(id) + if not subject: + flash("Subject does not exist") + return redirect(url_for('admin')) + return render_template('subject/delete.html', subject=subject) + +@app.route('/admin/subject//delete', methods=['POST']) +@admin_required +def delete_subject_post(id): + subject = Subject.query.get(id) + + if not subject: + return jsonify({'message': 'Subject not found!'}), 404 + + for chapter in subject.chapters: + for quiz in chapter.quizzes: + db.session.query(Scores).filter_by(quiz_id=quiz.id).delete() + db.session.delete(quiz) + + db.session.delete(subject) + db.session.commit() + return redirect(url_for('admin')) + +@app.route('/admin/quiz') +@admin_required +def quiz(): + quizzes = Quiz.query.all() + return render_template('quiz.html', quizzes=quizzes) + +@app.route('/admin/quiz/add') +@admin_required +def add_quiz(): + chapters = Chapter.query.all() + subjects = Subject.query.all() + return render_template('quiz/add.html', chapters=chapters, subjects=subjects) + +@app.route('/admin/quiz/add', methods=['POST']) +@admin_required +def add_quiz_post(): + name = request.form['name'] + remarks = request.form['remarks'] + chapter_id = request.form.get('chapter_id') + date_of_quiz = request.form.get('date_of_quiz') + time_duration = request.form.get('time_duration') + if not name or not chapter_id or not date_of_quiz or not time_duration: + flash("Please fill out the necessary details") + return redirect(url_for('add_quiz')) + quiz = Quiz.query.filter_by(quiz_name=name).first() + if quiz: + flash("Quiz already exists") + return redirect(url_for('add_quiz')) + try: + date_of_quiz = datetime.strptime(date_of_quiz, "%Y-%m-%d") + hours, minutes, seconds = map(int, time_duration.split(':')) + time_duration = timedelta(hours=hours, minutes=minutes, seconds=seconds) + except ValueError: + flash("Invalid date or time format") + return redirect(url_for('add_quiz')) + new_quiz = Quiz(quiz_name=name, remarks=remarks, chapter_id=int(chapter_id), date_of_quiz=date_of_quiz, time_duration=time_duration) + db.session.add(new_quiz) + db.session.commit() + flash("Quiz added successfully") + return redirect(url_for('quiz')) + +@app.route('/admin/quiz//edit') +@admin_required +def edit_quiz(id): + quiz = Quiz.query.get(id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('quiz')) + chapters = Chapter.query.all() + subjects = Subject.query.all() + return render_template('quiz/edit.html', quiz=quiz, chapters=chapters, subjects=subjects) + +@app.route('/admin/quiz//edit', methods=['POST']) +@admin_required +def edit_quiz_post(id): + quiz = Quiz.query.get(id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('quiz')) + + name = request.form['name'] + remarks = request.form['remarks'] + subject_id = request.form.get('subject_id') + chapter_id = request.form.get('chapter_id') + date_of_quiz = request.form.get('date_of_quiz') + time_duration = request.form.get('time_duration') + + if not name or not subject_id or not chapter_id or not date_of_quiz or not time_duration: + flash("Please fill out all the necessary details") + return redirect(url_for('edit_quiz', id=id)) + + selected_chapter = Chapter.query.get(chapter_id) + if not selected_chapter or int(selected_chapter.subject_id) != int(subject_id): + flash("Selected chapter does not belong to the selected subject") + return redirect(url_for('edit_quiz', id=id)) + + quiz.quiz_name = name + quiz.remarks = remarks + quiz.chapter_id = int(chapter_id) + + try: + parsed_date = datetime.strptime(date_of_quiz, "%Y-%m-%d") + parts = time_duration.split(':') + hours = int(parts[0]) + minutes = int(parts[1]) + seconds = int(parts[2]) + time_duration_obj = timedelta(hours=hours, minutes=minutes, seconds=seconds) + except ValueError: + flash("Invalid date or time format") + return redirect(url_for('edit_quiz', id=id)) + + quiz.date_of_quiz = parsed_date + quiz.time_duration = time_duration_obj + + db.session.commit() + flash("Quiz updated successfully") + return redirect(url_for('quiz')) + +@app.route('/admin/quiz//delete') +@admin_required +def delete_quiz(id): + quiz = Quiz.query.get(id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('quiz')) + return render_template('quiz/delete.html', quiz=quiz, chapters = Chapter.query.all(), subjects = Subject.query.all()) + +@app.route('/admin/quiz//delete', methods=['POST']) +@admin_required +def delete_quiz_post(id): + quiz = Quiz.query.get(id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('quiz')) + db.session.delete(quiz) + db.session.commit() + flash("Quiz deleted successfully") + return redirect(url_for('quiz')) + +@app.route('/admin/quiz//details') +@admin_required +def quiz_details(id): + quiz = Quiz.query.get(id) + chapters = Chapter.query.all() + subjects = Subject.query.all() + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('quiz')) + return render_template('quiz/details.html', quiz=quiz, chapters=chapters, subjects=subjects) + +@app.route('/admin/question/add/') +@admin_required +def add_question(quiz_id): + quiz = Quiz.query.get(quiz_id) + subject = Subject.query.get(quiz.chapter.subject_id) + chapter = Chapter.query.get(quiz.chapter_id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('quiz')) + last_question = Question.query.filter_by(quiz_id=quiz_id).order_by(Question.question_number.desc()).first() + next_question_number = (last_question.question_number + 1) if last_question else 1 + + return render_template('question/add.html', quiz=quiz, subject=subject, chapter=chapter, next_question_number=next_question_number) + +@app.route('/admin/question/add/', methods=['POST']) +@admin_required +def add_question_post(quiz_id): + quiz = Quiz.query.get(quiz_id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('quiz')) + question_number = request.form.get('question_number') + question_title = request.form.get('question_title') + question_statement = request.form.get('question_statement') + option1 = request.form.get('option1') + option2 = request.form.get('option2') + option3 = request.form.get('option3') + option4 = request.form.get('option4') + correct_option = request.form.get('correct_option') + if not question_number or not question_statement or not option1 or not option2 or not option3 or not option4 or not correct_option: + flash("Please fill out all the fields") + return redirect(url_for('add_question', quiz_id=quiz_id)) + question = Question.query.filter_by(question_number=question_number, quiz_id=quiz_id).first() + if question: + flash("Question already exists") + return redirect(url_for('add_question', quiz_id=quiz_id)) + new_question = Question(question_number=question_number, question_title = question_title, question_statement=question_statement, option1=option1, option2=option2, option3=option3, option4=option4, correct_option=correct_option, quiz_id=quiz_id) + db.session.add(new_question) + db.session.commit() + flash("Question added successfully") + return redirect(url_for('quiz', id=quiz_id)) + +@app.route('/admin/question//edit') +@admin_required +def edit_question(id): + question = Question.query.get(id) + if not question: + flash("Question does not exist") + return redirect(url_for('quiz')) + quiz = Quiz.query.get(question.quiz_id) + subject = Subject.query.get(quiz.chapter.subject_id) + chapter = Chapter.query.get(quiz.chapter_id) + return render_template('question/edit.html', question=question, quiz=quiz, subject=subject, chapter=chapter) + +@app.route('/admin/question//edit', methods=['POST']) +@admin_required +def edit_question_post(id): + question = Question.query.get(id) + if not question: + flash("Question does not exist") + return redirect(url_for('quiz')) + question_number = request.form.get('question_number') + question_title = request.form.get('question_title') + question_statement = request.form.get('question_statement') + option1 = request.form.get('option1') + option2 = request.form.get('option2') + option3 = request.form.get('option3') + option4 = request.form.get('option4') + correct_option = request.form.get('correct_option') + if not question_number or not question_statement or not option1 or not option2 or not option3 or not option4 or not correct_option: + flash("Please fill out all the fields") + return redirect(url_for('edit_question', id=id)) + question.question_number = question_number + question.question_title = question_title + question.question_statement = question_statement + question.option1 = option1 + question.option2 = option2 + question.option3 = option3 + question.option4 = option4 + question.correct_option = correct_option + db.session.commit() + flash("Question updated successfully") + return redirect(url_for('quiz', id=question.quiz_id)) + +@app.route('/admin/question//delete') +@admin_required +def delete_question(id): + question = Question.query.get(id) + if not question: + flash("Question does not exist") + return redirect(url_for('quiz')) + quiz_id = question.quiz_id + quiz = Quiz.query.get(quiz_id) + chapter = Chapter.query.get(quiz.chapter_id) + subject = Subject.query.get(chapter.subject_id) + return render_template('question/delete.html', question=question, quiz_id=quiz_id, subject=subject, chapter=chapter) + +@app.route('/admin/question//delete', methods=['POST']) +@admin_required +def delete_question_post(id): + question = Question.query.get(id) + if not question: + flash("Question does not exist") + return redirect(url_for('quiz')) + quiz_id = question.quiz_id + db.session.delete(question) + db.session.commit() + flash("Question deleted successfully") + return redirect(url_for('quiz', id=quiz_id)) + +@app.route('/quiz/') +@auth_required +def user_quiz(id): + quiz = Quiz.query.get(id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('index')) + subject = Subject.query.get(quiz.chapter.subject_id) + chapter = Chapter.query.get(quiz.chapter_id) + current_date = datetime.now() + return render_template('quiz_user/view.html', quiz=quiz, subject=subject, chapter=chapter, current_date=current_date) + +@app.route('/quiz//start') +@auth_required +def start_quiz(id): + quiz = Quiz.query.get(id) + if not quiz: + flash("Quiz does not exist") + return redirect(url_for('index')) + questions = Question.query.filter_by(quiz_id=id).all() + subject = Subject.query.get(quiz.chapter.subject_id) + chapter = Chapter.query.get(quiz.chapter_id) + quiz.time_duration = quiz.time_duration.total_seconds() + return render_template('quiz_user/start.html', quiz=quiz, questions=questions, subject=subject, chapter=chapter) + +@app.route('/quiz//submit', methods=['POST']) +@auth_required +def submit_quiz(id): + quiz = Quiz.query.get_or_404(id) + questions = Question.query.filter_by(quiz_id=id).all() + user_id = session['user_id'] + + user_answers_dict = {} + score = 0 + + for question in questions: + user_choice = request.form.get(f"q{question.id}") + user_answers_dict[str(question.id)] = user_choice + + if user_choice == question.correct_option: + score += 1 + + total_questions = len(questions) + + if not user_answers_dict: + flash("Your answers were not captured. Please try again.", "danger") + return redirect(url_for('quiz', id=id)) + + new_score = Scores( + user_id=user_id, + quiz_id=id, + total_scored=score, + time_stamp_of_event=datetime.now(ist), + user_answers=user_answers_dict + ) + + db.session.add(new_score) + db.session.commit() + + flash(f"Quiz Submitted Successfully! You scored {score}/{total_questions}.", "success") + return redirect(url_for('user_scores')) + + + +@app.route('/scores') +@auth_required +def user_scores(): + user = User.query.get(session['user_id']) + user_scores = Scores.query.filter_by(user_id=user.id).all() + quizzes = {quiz.id: {"name": quiz.quiz_name, "total_score": len(quiz.questions)} for quiz in Quiz.query.filter(Quiz.id.in_([score.quiz_id for score in user_scores])).all()} + + return render_template('scores/score.html', user_scores=user_scores, quizzes=quizzes, user=user) + + +@app.route('/scores//details') +@auth_required +def score_details(id): + user_id = session.get('user_id') + score_entry = Scores.query.filter_by(id=id, user_id=user_id).first() + + if not score_entry: + flash("You don't have access to this score.", "danger") + return redirect(url_for('user_scores')) + + quiz_id = score_entry.quiz_id + quiz = Quiz.query.get(quiz_id) + total_questions = Question.query.filter_by(quiz_id=quiz_id).count() + user_answers_dict = score_entry.user_answers if score_entry.user_answers else {} + questions = Question.query.filter_by(quiz_id=quiz_id).all() + + user_answers = [] + for question in questions: + user_answer = user_answers_dict.get(str(question.id), "Not Answered") + correct_answer = question.correct_option + user_answers.append({ + "question_text": question.question_statement, + "user_answer": user_answer, + "correct_answer": correct_answer, + "is_correct": user_answer == correct_answer + }) + + return render_template('scores/quiz_details.html', + score=score_entry, + quiz=quiz, + user_answers=user_answers, + total_questions=total_questions) + +@app.route('/summary') +@auth_required +def user_summary(): + user_id = session.get('user_id') + + if not user_id: + return redirect(url_for('login')) + + user = User.query.get(user_id) + if not user: + return "User not found", 404 + + subject_stats = db.session.query( + Subject.subject_name, + (func.sum(Scores.total_scored) * 100.0 / func.sum( + db.session.query(func.count(Question.id)).filter(Question.quiz_id == Scores.quiz_id).as_scalar() + )).label("avg_percentage") + ).join(Chapter, Chapter.subject_id == Subject.id) \ + .join(Quiz, Quiz.chapter_id == Chapter.id) \ + .join(Scores, Scores.quiz_id == Quiz.id) \ + .filter(Scores.user_id == user_id) \ + .group_by(Subject.subject_name) \ + .all() + + subject_stats = [ + {"subject_name": s.subject_name, "avg_percentage": round(s.avg_percentage, 2) if s.avg_percentage else 0} + for s in subject_stats + ] + + quiz_attempts = db.session.query( + func.strftime('%Y-%m', Scores.time_stamp_of_event).label("month"), + func.count(Scores.id).label("attempts") + ).filter(Scores.user_id == user_id) \ + .group_by("month") \ + .order_by("month") \ + .all() + + formatted_quiz_attempts = [] + for entry in quiz_attempts: + if entry.month: + formatted_date = datetime.strptime(entry.month, "%Y-%m").strftime("%B, %Y") + else: + formatted_date = "Unknown Date" + formatted_quiz_attempts.append({"month": formatted_date, "attempts": entry.attempts}) + + return render_template('summary/user_summary.html', subject_stats=subject_stats, quiz_attempts=formatted_quiz_attempts) + +@app.route('/debug-session') +def debug_session(): + return jsonify(dict(session)) + +@app.route('/admin/summary') +@admin_required +def admin_summary(): + subjects = Subject.query.all() + subject_labels = [subject.subject_name for subject in subjects] + subject_stats = [] + + for subject in subjects: + quizzes = Quiz.query.join(Chapter).filter(Chapter.subject_id == subject.id).all() + total_marks_per_user = {} + + for quiz in quizzes: + total_marks = db.session.query(func.count(Question.id)) \ + .filter(Question.quiz_id == quiz.id) \ + .scalar() or 1 + + quiz_scores = db.session.query(Scores.user_id, func.sum(Scores.total_scored)) \ + .filter(Scores.quiz_id == quiz.id) \ + .group_by(Scores.user_id) \ + .all() + + for user_id, total_scored in quiz_scores: + if user_id not in total_marks_per_user: + total_marks_per_user[user_id] = {"scored": 0, "total": 0} + + total_marks_per_user[user_id]["scored"] += total_scored + total_marks_per_user[user_id]["total"] += total_marks * db.session.query(func.count(Scores.id)).filter(Scores.quiz_id == quiz.id, Scores.user_id == user_id).scalar() or 1 + + top_scorer = None + top_percentage = 0 + total_percentage_sum = 0 + attempt_count = len(total_marks_per_user) + + for user_id, marks in total_marks_per_user.items(): + percentage = (marks["scored"] / marks["total"]) * 100 if marks["total"] > 0 else 0 + total_percentage_sum += percentage + + if percentage > top_percentage: + top_percentage = percentage + top_scorer = User.query.get(user_id) + + avg_percentage = total_percentage_sum / attempt_count if attempt_count > 0 else 0 + + subject_stats.append({ + "subject_name": subject.subject_name, + "top_scorer": top_scorer.name if top_scorer else "No attempts", + "top_percentage": round(top_percentage, 2), + "avg_percentage": round(avg_percentage, 2) + }) + + return render_template('summary/admin_summary.html', + subject_stats=subject_stats, + subject_labels=subject_labels) + +@app.route('/search/user') +@auth_required +def user_search(): + query = request.args.get('q', '').strip() + + if not query: + return render_template('search_results.html', results=[], query=query) + + results = [] + subjects = Subject.query.filter(Subject.subject_name.ilike(f"%{query}%")).all() + quizzes = Quiz.query.filter(Quiz.quiz_name.ilike(f"%{query}%")).all() + + results.extend([ + {"type": "Subject", "name": subject.subject_name, "id": subject.id} for subject in subjects + ]) + results.extend([ + {"type": "Quiz", "name": quiz.quiz_name, "id": quiz.id} for quiz in quizzes + ]) + + return render_template('search/search_results.html', results=results, query=query) + +@app.route('/quiz/', methods=['GET']) +@auth_required +def view_quiz(quiz_id): + quiz = Quiz.query.get_or_404(quiz_id) + questions = Question.query.filter_by(quiz_id=quiz_id).all() + subject = Subject.query.get(quiz.chapter.subject_id) + chapter = Chapter.query.get(quiz.chapter_id) + current_date = datetime.now() + return render_template('quiz.html', quiz=quiz, questions=questions, subject=subject, chapter=chapter, current_date=current_date) + +@app.route('/subject/', methods=['GET']) +@auth_required +def view_subject(subject_id): + subject = Subject.query.get_or_404(subject_id) + return render_template('search/subject_details.html', subject=subject) + +@app.route('/admin/user/') +@admin_required +def admin_view_user(user_id): + user = User.query.get_or_404(user_id) + user_scores = db.session.query(Scores).filter(Scores.user_id == user_id).all() + total_quizzes = len(user_scores) + highest_score = max((s.total_scored for s in user_scores), default=0) + + total_score_sum = 0 + total_marks_sum = 0 + quiz_attempts = [] + + for s in user_scores: + total_marks = db.session.query(func.count(Question.id)).filter(Question.quiz_id == s.quiz_id).scalar() or 1 + total_marks_sum += total_marks + total_score_sum += s.total_scored + + quiz_attempts.append({ + "quiz_name": s.quiz.quiz_name, + "subject_name": s.quiz.chapter.subject.subject_name, + "score": s.total_scored, + "total_marks": total_marks, + "percentage": round((s.total_scored / total_marks) * 100, 2) + }) + + average_score = (total_score_sum / total_marks_sum * 100) if total_marks_sum > 0 else 0 + + return render_template( + 'search/user_details.html', + user=user, + scores=quiz_attempts, + total_quizzes=total_quizzes, + average_score=round(average_score, 2), + highest_score=highest_score + ) + +@app.route('/admin/search') +@admin_required +def admin_search(): + query = request.args.get('q', '').strip() + + if not query: + return render_template('search_results.html', results=[], query=query) + + results = [] + users = User.query.filter(User.name.ilike(f"%{query}%")).all() + subjects = Subject.query.filter(Subject.subject_name.ilike(f"%{query}%")).all() + quizzes = Quiz.query.filter(Quiz.quiz_name.ilike(f"%{query}%")).all() + + results.extend([ + {"type": "User", "name": user.name, "id": user.id} for user in users + ]) + results.extend([ + {"type": "Subject", "name": subject.subject_name, "id": subject.id} for subject in subjects + ]) + results.extend([ + {"type": "Quiz", "name": quiz.quiz_name, "id": quiz.id} for quiz in quizzes + ]) + + return render_template('search/search_results.html', results=results, query=query) \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/instance/db.sqlite3 b/Domains/FullStack/MiniProjects/QuizMaster/instance/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..f1d62f107670dc1fbaaca66e78b3fc3465cd829b GIT binary patch literal 45056 zcmeI5OKcoT8GyUzVP~9;8(1t84BC!2kXT7ZRo&IE0Tw3lB=N>^;ztPKVye5VJrmDN zJJUUzc%wZeyW$}ZT=s&*3B(0);edc65+^{s1OmZwkPz)pFO%>#NI+ROnIMY4KDym3Jtrs(eh>6-D_he2&9sa7@BUVekcht9#DJ zoqkp+-~Gu6?VrljvFDZPA80>5@tf%{J@dsAUq5a>vr}qAA|6Np2_OL^fCP}h|003M zSEnXtPo7j?+fKRP6iE3_Nsu!1QdM`~sJ5_3g`qIiq?MiJ;U%9cN zuiRQ*KCe%ex{2s)j=6TP+jx20wKPt7b2C$axZHS(=y?yg;y_@CTHLOe)ZG0GnDtbB1s!@d+>W|1m__22%rOz z&33otgG+}&AIhYSv?=tDSJy6Gt*)IlEPG)OnyJ!I4mhTwB@s$QBQo)hbeE1-(i1SA zCSX2IfQ=V`>emrLy4f=|l%xBj8DE{AR^m@7#K)D%$=R71^|e7EHeQxFj_oTvS?FV1 zLS~}PTTjZvGe!gGh!*c`C&Tz;dC967)cH<2z8Qs3cCrm*mF|!xFjdOhO4#jiS(Jyh zlEa(Ct(B$KTQ&Xc(DMTg<%wq_)xV$IZvkhHP0W61MpYW^P&`QPHR0i7lXufN`<{8d zNu`O><98G%XXobBSMO&{rLU#`Yhr};(85^UeTmH@i4TNAxW#oESxrAcKk52+W#t=l z6FaPC4Zsc5OCJufd!l!QT|c?c?!v^xY;|rNyMcb%Kbd^=LOvt-c)fSu?z!GqSr{QW zv@@3Az`-L44up;(cod>R{tVI7!iB<7@eYJ(|D^a>RkL>as>tG%_h|XajYQhJbB_&E zUfv&~Y;`+4N$NbQk5q_}TjNMBn`I>&#{RH@NiFxfyxE8vL9glUy%Wo;jbxLDtwvkF zc;m)$t-3Oz{wQn%rx&Ic&g712UQ%$A%Aa}oL*tnIW8(yTiqG6pw5!vfIq~BY8l2*R z1dsp{Kmter2_OL^fCP{L5_oe29+}0GGV^$K1|Bqc$XoDCy}OfEOvAC=id&(l*LHk| zZH0d8N@F#=_2A~|&~!*Z4AZh`PBJY3pa`!-!q9}IKmS)G5pB4h-Lbg=lM3XnB#ed!5oWH8Zp!H zs^I0Lj}%JE$;Yc70IzrA_%6SDz;Al-Hcy1TM6a!jXyuc4Pe*phh3lK#4u~HL$9K6Y zm~AspP!V~)Vf&#QIj$=Vi-Z&+vLf5^sUHz4h(`>Uk-!$F<4`jQs26eJ1eQx}i#VRk zsqZr8S!Ni3H1S-A2jD&TTpMUm;hHz4pZbf?gTkAStb9qCeY`q5@c)4O_MNL_(OU7V z%RzN}dF`dso&~fb%Vz;-r_8Xq<8onA!wxv%UdSEKFwF>p0+P1LLoiHiK_in#hATqA zPnbyq*M-YAu^k>dmJtxsF@cO13d8jnwH>jxaac!w`-+b`cFJ1^eZ?nbMpeGc`-32X~0h@hV5MNwoiYMQPc8oq517Mdhv zkixjjJckRxeeN@xIj%5)sOcNvdL%5UV}wXG#N-B)0>m9zfz53*fZ#pHFgRRxh{3rL z1`rX{To%E5tr7Emtxx~X;i3oL= z%HI;O8lw#}{+qgJZ#CLNbQn#500|%g zB!C2v01`j~NB{{S0VIF~kidVD!14T?+V6KLKAS(M?(0~{W&mWp19>?=Kz1(Vz}r%m zB**{r+Ut4kYuazM*R|KQ+yBKt&@>W20!RP}AOR$R1dsp{Kmter2_S+0F9PR^MVJhr zUfCR4cNq158~F&yC;guDR@xt z#B#4m*rjtNZi^zx7nSF)sW44o8|D@?8%YWq`6c@0rOP)my$zTn&`e^z(b|bSDQ~Aa z;U~|5A2W`6b>sT-`nG6_6s85lk$xX8!OojtTdx1lYd@XT{;vH_`>FOr?T7zgpwU|- zfCP{L5GRS5C$licr zxGUew+4%qTUli@z+J~qAGX4AMQ`4v34%{$CB!C2v01`j~NB{{S0VIF~kN^_cN8t9v zqyqo2v0ANeaahm}7ESLOdl1-<>p*o``jWWyW&B|WU5?~j#d{|mD?G((C^s9<~qFXtweh1Ni;^f#MQKR$rLIQ>hav-@P6{yz&#g@|Oa zWb~*kh5Ublr#JrpD@FT<_ABj=+ArYs-F-Cxzajx7fCP{L5q2kty&`SJ-A=Y*eI-uB`gWte5x2LxqP8m%Un>1n={Y_(J9|b`7aLL~ ztWEFfldIgb`2cm%+>yJ}>uIcqnM`IVisNuSjaxjZU+lm>^JZ zfqt($pxq1gfR7*cJ1_LTJSDdT@N=iL_%dr+X`C_Md;U)q?PuCov~=prZ}PSIwrr^w zG!j4pNB{{S0VIF~kia+s)%Q&*s#>Zp752_@rB;O+6~iktVi}A+oOk9c`n*4XUY~d6 zSs>56-q|bFIZ#njLB-w)uAqY071J%-#4s3nI8TQvjG+p%m-dRH6z5b`ty;N4ZqFoH z@PRrN!pfFMUDta!Z%KJBjoba4&wNh#v-BTw?#l?qoiZ~SHI078%>O+ZzdkM_1&fx$ zoN*ZwRXuiyMXO?E#7x&bU@@G31zfFULFPw;q!kNryJgd{Ean^*WOb%bI6p!-%Lvn; zEz6)5&^elL{yS>vSaoTi2E(jaVA`-<>h?8cg`1U8C`o5!1n$E&WcLp#BjQyoqr%*> z!(7vas&cT5s_*K%pBoxCT%CFq!>%x|Y}lSnA>+~R=l+$|u>&e3gtF-YJ3#jo72i5U zg|d*)P +

+ Admin Dashboard +

+ + + +

+ Subjects +

+ + {% if subjects %} +
+ {% for subject in subjects %} +
+
+
+
{{ subject.subject_name }}
+
+
+ {% if subject.chapters %} + + + + + + + + + + {% for chapter in subject.chapters %} + + + + + + {% endfor %} + +
ChapterQuestionsAction
{{ chapter.chapter_name }}{{ chapter.get_questions_count() }} + + + + + + +
+ {% else %} +

No chapters available.

+ {% endif %} + + +
+ +
+
+ {% endfor %} +
+ {% else %} +

No subjects available.

+ {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/add.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/add.html new file mode 100644 index 00000000..fb883413 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/add.html @@ -0,0 +1,39 @@ +{% extends 'layout.html' %} + +{% block title %} + Add Chapter +{% endblock %} + +{% block content %} +
+
+
+

New Chapter under {{ subject.subject_name }}

+
+
+
+ + +
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/delete.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/delete.html new file mode 100644 index 00000000..999e1322 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/delete.html @@ -0,0 +1,41 @@ +{% extends 'layout.html' %} + +{% block title %} + Delete Chapter +{% endblock %} + +{% block content %} +
+
+
+

Delete Chapter

+
+
+
+
+ + +
+ +
+ + +
+ +
+ Are you sure you want to delete this chapter? +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/edit.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/edit.html new file mode 100644 index 00000000..ce2b1cb0 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/chapter/edit.html @@ -0,0 +1,37 @@ +{% extends 'layout.html' %} + +{% block title %} + Edit Chapter +{% endblock %} + +{% block content %} +
+
+
+

Edit Chapter

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/index.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/index.html new file mode 100644 index 00000000..74872d45 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/index.html @@ -0,0 +1,134 @@ +{% extends 'layout.html' %} + +{% block title %} User Dashboard {% endblock %} + +{% block content %} +
+

Welcome, {{ user.name }}!

+ + +
+
+

+ Quizzes Available Now +

+
+
+ {% if available_quizzes %} + + + + + + + + + + + + {% for quiz in available_quizzes %} + + + + + + + + {% endfor %} + +
Name Questions Date Duration Actions
{{ quiz.quiz_name }}{{ quiz_question_counts[quiz.id] }}{{ quiz.date_of_quiz.strftime('%Y-%m-%d') }}{{ quiz.time_duration }} + + View + + + Start + +
+ {% else %} +

No quizzes available at the moment.

+ {% endif %} +
+
+ + +
+
+

+ Upcoming Quizzes +

+
+
+ {% if upcoming_quizzes %} + + + + + + + + + + + + {% for quiz in upcoming_quizzes %} + + + + + + + + {% endfor %} + +
Name Questions Date Duration Details
{{ quiz.quiz_name }}{{ quiz_question_counts[quiz.id] }}{{ quiz.date_of_quiz.strftime('%Y-%m-%d') }}{{ quiz.time_duration }} + + View + +
+ {% else %} +

No upcoming quizzes scheduled.

+ {% endif %} +
+
+ + +
+
+

+ Attempted Quizzes +

+
+
+ {% if attempted_quizzes %} + + + + + + + + + + + {% for quiz in attempted_quizzes %} + + + + + + + {% endfor %} + +
Name Questions Date Details
{{ quiz.quiz_name }}{{ quiz_question_counts[quiz.id] }}{{ quiz.date_of_quiz.strftime('%Y-%m-%d') }} + + View + +
+ {% else %} +

You haven't attempted any quizzes yet.

+ {% endif %} +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/layout.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/layout.html new file mode 100644 index 00000000..365af3ff --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/layout.html @@ -0,0 +1,65 @@ + + + + + + + {% block title %} Quiz Master {% endblock %} + + + + + + {% block style %} + + {% endblock %} + + + {% include 'navbar.html' with context %} + +
+ {% include 'messages.html' with context %} +
+ +
+ {% block content %} + {% endblock %} +
+ + {% block script %}{% endblock %} + + + + \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/login.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/login.html new file mode 100644 index 00000000..ccc9d362 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/login.html @@ -0,0 +1,41 @@ +{% extends 'layout.html' %} + +{% block title %} Login {% endblock %} + +{% block content %} +
+
+

+ Login +

+ +
+
+ + +
+ +
+ + +
+ + +
+ +
+

Don't have an account? + Register +

+
+
+
+{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/messages.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/messages.html new file mode 100644 index 00000000..316fdf12 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/messages.html @@ -0,0 +1,17 @@ +{% with messages = get_flashed_messages() %} + {% if messages %} +
    + {% for message in messages %} + {% if 'success' in message|lower %} + + {% else %} + + {% endif %} + {% endfor %} +
+ {% endif %} + {% endwith %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/navbar.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/navbar.html new file mode 100644 index 00000000..7445ed3c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/navbar.html @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/profile.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/profile.html new file mode 100644 index 00000000..86bb2eb4 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/profile.html @@ -0,0 +1,60 @@ +{% extends 'layout.html' %} + +{% block title %} Profile {% endblock %} + +{% block content %} +
+
+

+ Profile +

+ +

Hello, {{ user.name }}

+ + + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/question/add.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/question/add.html new file mode 100644 index 00000000..f87d2228 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/question/add.html @@ -0,0 +1,72 @@ +{% extends 'layout.html' %} + +{% block title %} + Add Question +{% endblock %} + +{% block content %} +
+
+
+

Add New Question

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/question/delete.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/question/delete.html new file mode 100644 index 00000000..0736fce4 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/question/delete.html @@ -0,0 +1,72 @@ +{% extends 'layout.html' %} + +{% block title %} + Delete Question +{% endblock %} + +{% block content %} +
+
+
+

Delete Question

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/question/edit.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/question/edit.html new file mode 100644 index 00000000..f0f68056 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/question/edit.html @@ -0,0 +1,72 @@ +{% extends 'layout.html' %} + +{% block title %} + Edit Question +{% endblock %} + +{% block content %} +
+
+
+

Edit Question

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz.html new file mode 100644 index 00000000..f3b54556 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz.html @@ -0,0 +1,82 @@ +{% extends 'layout.html' %} + +{% block title %} Quiz {% endblock %} + +{% block content %} +
+

+ Quiz Management +

+ + + + {% if quizzes %} +
+ {% for quiz in quizzes %} +
+
+ +
+ {% if quiz.questions %} + + + + + + + + + + {% for question in quiz.questions %} + + + + + + {% endfor %} + +
Q#TitleActions
{{ question.question_number }}{{ question.question_title }} + + + + + + +
+ {% else %} +

No questions available.

+ {% endif %} + + +
+ +
+
+ {% endfor %} +
+ {% else %} +

No quizzes available.

+ {% endif %} +
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/add.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/add.html new file mode 100644 index 00000000..fc0e7562 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/add.html @@ -0,0 +1,94 @@ +{% extends 'layout.html' %} + +{% block title %} + Add Quiz +{% endblock %} + +{% block content %} +
+
+
+

Add Quiz

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/delete.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/delete.html new file mode 100644 index 00000000..ddce1153 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/delete.html @@ -0,0 +1,67 @@ +{% extends 'layout.html' %} + +{% block title %} + Delete Quiz +{% endblock %} + +{% block content %} +
+
+
+

Delete Quiz

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/details.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/details.html new file mode 100644 index 00000000..5e8bfa62 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/details.html @@ -0,0 +1,64 @@ +{% extends 'layout.html' %} + +{% block title %} + Quiz Details +{% endblock %} + +{% block content %} +
+
+
+

Quiz Details

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/edit.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/edit.html new file mode 100644 index 00000000..11f6e5b6 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz/edit.html @@ -0,0 +1,131 @@ +{% extends 'layout.html' %} + +{% block title %} + Edit Quiz +{% endblock %} + +{% block content %} +
+
+
+

Edit Quiz

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/start.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/start.html new file mode 100644 index 00000000..d4f19001 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/start.html @@ -0,0 +1,180 @@ +{% extends 'layout.html' %} + +{% block title %} + Start {{ quiz.quiz_name }} +{% endblock %} + +{% block content %} +
+

{{ quiz.quiz_name }}

+ +
+
+ Time Left: +
+
+ Question: 1 / +
+
+ +
+
+ {% for question in questions %} +
+

Q{{ loop.index }}: {{ question.question_statement }}

+ +
+ + + + + + + +
+
+ {% endfor %} +
+ +
+ + +
+ +
+ +
+
+
+ +{% endblock %} + +{% block script %} + + + + +{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/view.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/view.html new file mode 100644 index 00000000..1a645448 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/quiz_user/view.html @@ -0,0 +1,45 @@ +{% extends 'layout.html' %} + +{% block title %} + {{ quiz.quiz_name }} - Quiz Details +{% endblock %} + +{% block content %} +
+
+
+

+ {{ quiz.quiz_name }} +

+

Quiz Details

+ +
+
+

Remarks: {{ quiz.remarks or "No remarks provided" }}

+

Subject: {{ subject.subject_name }}

+

Chapter: {{ chapter.chapter_name }}

+
+
+

Date: {{ quiz.date_of_quiz.strftime('%Y-%m-%d') }}

+

Time Duration: {{ quiz.time_duration }}

+

Number of Questions: {{ quiz.questions|length }}

+
+
+ +
+ {% if quiz.date_of_quiz <= current_date %} + + Start Quiz + + {% else %} +

This quiz is not available yet.

+ {% endif %} + + + Back to Quizzes + +
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/register.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/register.html new file mode 100644 index 00000000..3bfa10e7 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/register.html @@ -0,0 +1,57 @@ +{% extends 'layout.html' %} + +{% block title %} Register {% endblock %} + +{% block content %} +
+
+

+ Register +

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+

Already have an account? + Login +

+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/scores/quiz_details.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/scores/quiz_details.html new file mode 100644 index 00000000..e1f2212f --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/scores/quiz_details.html @@ -0,0 +1,65 @@ +{% extends 'layout.html' %} + +{% block title %} + Quiz Details - {{ quiz.quiz_name }} +{% endblock %} + +{% block content %} +
+

{{ quiz.quiz_name }} - Details

+ +
+
+
Quiz Summary
+
+
+

Date Attempted: {{ score.time_stamp_of_event.strftime('%Y-%m-%d %H:%M') }}

+

Score: + {{ score.total_scored }} / {{ total_questions }} +

+
+
+ +
+
+
Your Answers vs Correct Answers
+
+
+
+ + + + + + + + + + + {% for answer in user_answers %} + + + + + + + {% endfor %} + +
Question Your Answer Correct Answer Result
{{ answer.question_text }}{{ answer.user_answer }}{{ answer.correct_answer }} + {% if answer.is_correct %} + Correct + {% else %} + Incorrect + {% endif %} +
+
+
+
+ + +
+{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/scores/score.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/scores/score.html new file mode 100644 index 00000000..93e4f5e6 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/scores/score.html @@ -0,0 +1,47 @@ +{% extends 'layout.html' %} + +{% block title %} My Scores {% endblock %} + +{% block content %} +
+

My Quiz Scores

+ + {% if user_scores %} +
+ + + + + + + + + + + {% for score in user_scores|sort(attribute="time_stamp_of_event", reverse=True) %} + + + + + + + {% endfor %} + +
Quiz Name Date Attempted Score Actions
{{ quizzes[score.quiz_id]["name"] }}{{ score.time_stamp_of_event.strftime('%Y-%m-%d %H:%M') }} + + {{ score.total_scored }} / {{ quizzes[score.quiz_id]["total_score"] }} + + + + View Details + +
+
+ {% else %} +
+

No quiz attempts yet!

+

Take a quiz to see your scores here.

+
+ {% endif %} +
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/search/search_results.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/search/search_results.html new file mode 100644 index 00000000..199725e4 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/search/search_results.html @@ -0,0 +1,36 @@ +{% extends "layout.html" %} + +{% block title %} + Search Results +{% endblock %} + +{% block content %} +
+

Search Results for "{{ query }}"

+ + {% if results %} +
    + {% for result in results %} +
  • +
    + {{ result.type }}: + {{ result.name }} +
    + + View + +
  • + {% endfor %} +
+ {% else %} +
+ No results found. +
+ {% endif %} +
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/search/subject_details.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/search/subject_details.html new file mode 100644 index 00000000..ba90ed8c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/search/subject_details.html @@ -0,0 +1,51 @@ +{% extends 'layout.html' %} + +{% block content %} +
+
+

{{ subject.subject_name }}

+

Description: {{ subject.subject_description }}

+
+ +
+ +

Chapters

+ + {% if subject.chapters %} +
+ {% for chapter in subject.chapters %} +
+

+ +

+
+
+

{{ chapter.chapter_description }}

+ + {% if chapter.quizzes %} +
Available Quizzes:
+ + {% else %} +

No quizzes available.

+ {% endif %} +
+
+
+ {% endfor %} +
+ {% else %} +
No chapters available for this subject.
+ {% endif %} +
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/search/user_details.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/search/user_details.html new file mode 100644 index 00000000..6bc5be6a --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/search/user_details.html @@ -0,0 +1,89 @@ +{% extends "layout.html" %} + +{% block title %} User Details {% endblock %} + +{% block content %} +
+
+

+ User Details +

+
+

+ {{ user.name }} +

+

Username: {{ user.username }}

+

+ + + {% if user.is_admin %} Admin {% else %} User {% endif %} + +

+
+
+ +
+ +

+ Quiz Statistics +

+
+
+
+
+
Total Quizzes Attempted
+

{{ total_quizzes }}

+
+
+
+
+
+
+
Average Score
+

{{ average_score }}%

+
+
+
+
+
+
+
Highest Score
+

{{ highest_score }}

+
+
+
+
+ +

+ Quiz Attempts +

+ {% if scores %} +
+ + + + + + + + + + + + {% for score in scores %} + + + + + + + + {% endfor %} + +
Quiz Name Subject Score Total Marks Percentage
{{ score.quiz_name }}{{ score.subject_name }}{{ score.score }}{{ score.total_marks }}{{ score.percentage }}%
+
+ {% else %} +
No quizzes attempted by this user.
+ {% endif %} +
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/add.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/add.html new file mode 100644 index 00000000..8ca4e47f --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/add.html @@ -0,0 +1,64 @@ +{% extends 'layout.html' %} + +{% block title %} + Add Subject +{% endblock %} + +{% block content %} +
+
+
+

Add New Subject

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} + +{% block style %} + +{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/delete.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/delete.html new file mode 100644 index 00000000..cdde7364 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/delete.html @@ -0,0 +1,39 @@ +{% extends 'layout.html' %} + +{% block title %} + Delete Subject +{% endblock %} + +{% block content %} +
+
+
+

Delete Subject

+
+
+
+
+ + +
+ +
+ + +
+ +

Are you sure you want to delete this subject?

+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/edit.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/edit.html new file mode 100644 index 00000000..648421b1 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/subject/edit.html @@ -0,0 +1,37 @@ +{% extends 'layout.html' %} + +{% block title %} + Edit Subject +{% endblock %} + +{% block content %} +
+
+
+

Edit Subject

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + + Cancel + +
+
+
+
+
+{% endblock %} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/summary/admin_summary.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/summary/admin_summary.html new file mode 100644 index 00000000..d362dbc3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/summary/admin_summary.html @@ -0,0 +1,95 @@ +{% extends 'layout.html' %} + +{% block title %} Admin Summary {% endblock %} + +{% block content %} +
+

+ Admin Dashboard - Summary +

+ +
+ + + + + + + + + + + {% for subject in subject_stats %} + + + + + + + {% endfor %} + +
SubjectTop ScorerTop PercentageAverage Percentage
{{ subject.subject_name }}{{ subject.top_scorer or 'N/A' }}{{ subject.top_percentage | round(2) }}%{{ subject.avg_percentage | round(2) }}%
+
+ +
+

Average Percentage by Subject

+
+ +
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/templates/summary/user_summary.html b/Domains/FullStack/MiniProjects/QuizMaster/templates/summary/user_summary.html new file mode 100644 index 00000000..b93d4313 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/templates/summary/user_summary.html @@ -0,0 +1,92 @@ +{% extends 'layout.html' %} + +{% block title %} User Summary {% endblock %} + +{% block content %} +
+

User Summary

+ +
+

Average Percentage by Subject

+
+ +
+
+ +
+

Quiz Attempts Per Month

+
+ + + + + + + + + {% for entry in quiz_attempts %} + + + + + {% endfor %} + +
MonthAttempts
{{ entry.month }}{{ entry.attempts }}
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/Activate.ps1 b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/Activate.ps1 new file mode 100644 index 00000000..b49d77ba --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate new file mode 100644 index 00000000..ec51a454 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath "/Users/ekanshjindal/IITM/MAD1/quizmaster/venv") +else + # use the path as-is + export VIRTUAL_ENV="/Users/ekanshjindal/IITM/MAD1/quizmaster/venv" +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(venv) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(venv) " + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.csh b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.csh new file mode 100644 index 00000000..7a9a80c2 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/ekanshjindal/IITM/MAD1/quizmaster/venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(venv) $prompt" + setenv VIRTUAL_ENV_PROMPT "(venv) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.fish b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.fish new file mode 100644 index 00000000..b11f634c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/ekanshjindal/IITM/MAD1/quizmaster/venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(venv) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(venv) " +end diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/dotenv b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/dotenv new file mode 100755 index 00000000..f561dd30 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/dotenv @@ -0,0 +1,8 @@ +#!/Users/ekanshjindal/IITM/MAD1/quizmaster/venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from dotenv.__main__ import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/flask b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/flask new file mode 100755 index 00000000..632e3f4d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/flask @@ -0,0 +1,8 @@ +#!/Users/ekanshjindal/IITM/MAD1/quizmaster/venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from flask.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/gunicorn b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/gunicorn new file mode 100755 index 00000000..13e569c7 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/gunicorn @@ -0,0 +1,8 @@ +#!/Users/ekanshjindal/IITM/MAD1/quizmaster/venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from gunicorn.app.wsgiapp import run +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run()) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip new file mode 100755 index 00000000..eda6faf5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip @@ -0,0 +1,8 @@ +#!/Users/ekanshjindal/IITM/MAD1/quizmaster/venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3 b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3 new file mode 100755 index 00000000..eda6faf5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/Users/ekanshjindal/IITM/MAD1/quizmaster/venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3.12 b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3.12 new file mode 100755 index 00000000..eda6faf5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/Users/ekanshjindal/IITM/MAD1/quizmaster/venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python new file mode 120000 index 00000000..11b9d885 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python @@ -0,0 +1 @@ +python3.12 \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3 b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3 new file mode 120000 index 00000000..11b9d885 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3 @@ -0,0 +1 @@ +python3.12 \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3.12 b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3.12 new file mode 120000 index 00000000..a7a5fcca --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/bin/python3.12 @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12 \ No newline at end of file diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/AUTHORS.md b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/AUTHORS.md new file mode 100644 index 00000000..bbcfb5c5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/AUTHORS.md @@ -0,0 +1,132 @@ +Authors +======= + +A huge thanks to all of our contributors: + +- Adam Chainz +- Alec Nikolas Reiter +- Alex Gaynor +- Alex M +- Alex Morken +- Andrew Dunham +- Andriy Yurchuk +- Anil Kulkarni +- Antonio Dourado +- Antonio Herraiz +- Ares Ou +- Artur Rodrigues +- Axel Haustant +- Belousow Makc +- Benjamin Dopplinger +- Bennett, Bryan +- Bohan Zhang +- Bryan Bennett +- Bulat Bochkariov +- Cameron Brandon White +- Catherine Devlin +- Dan Quirk +- Daniele Esposti +- Dario Bertini +- David Arnold +- David Baumgold +- David Boucha +- David Crawford +- Dimitris Theodorou +- Doug Black +- Evan Dale Aromin +- Eyal Levin +- Francesco Della Vedova +- Frank Stratton +- Garret Raziel +- Gary Belvin +- Gilles Dartiguelongue +- Giorgio Salluzzo +- Guillaume BINET +- Heston Liebowitz +- Hu WQ +- Jacob Magnusson +- James Booth +- James Ogura +- James Turk +- Jeff Widman +- Joakim Ekberg +- Johannes +- Jordan Yelloz +- Josh Friend +- Joshua C. Randall +- Joshua Randall +- José Fernández Ramos +- Juan Rossi +- JuneHyeon Bae +- Kamil Gałuszka +- Kevin Burke +- Kevin Deldycke +- Kevin Funk +- Kyle Conroy +- Lance Ingle +- Lars Holm Nielsen +- Luiz Armesto +- Malthe Borch +- Marek Hlobil +- Matt Wright +- Max Mautner +- Max Peterson +- Maxim +- Michael Hwang +- Michael Newman +- Miguel Grinberg +- Mihai Tomescu +- Neil Halelamien +- Nicolas Harraudeau +- Pavel Tyslyatsky +- Petrus J.v.Rensburg +- Philippe Ndiaye +- Piotr Husiatyński +- Prasanna Swaminathan +- Robert Warner +- Rod Cloutier +- Ryan Horn +- Rémi Alvergnat +- Sam Kimbrel +- Samarth Shah +- Sami Jaktholm +- Sander Sink +- Sasha Baranov +- Saul Diez-Guerra +- Sergey Romanov +- Shreyans Sheth +- Steven Leggett +- Sven-Hendrik Haase +- Usman Ehtesham Gul +- Victor Neo +- Vlad Frolov +- Vladimir Pal +- WooParadog +- Yaniv Aknin +- akash +- bret barker +- hachichaud +- jbouzekri +- jobou +- johnrichter +- justanr +- k-funk +- kelvinhammond +- kenjones +- kieran gorman +- kumy +- lyschoening +- mailto1587 +- mniebla +- mozillazg +- muchosalsa +- nachinius +- nixdata +- papaeye +- pingz +- saml +- siavashg +- silasray +- soasme +- ueg1990 +- y-p diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/LICENSE b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/LICENSE new file mode 100644 index 00000000..3337f908 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2013, Twilio, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the Twilio, Inc. nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/METADATA new file mode 100644 index 00000000..4ad3ddb4 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/METADATA @@ -0,0 +1,29 @@ +Metadata-Version: 2.1 +Name: Flask-RESTful +Version: 0.3.10 +Summary: Simple framework for creating REST APIs +Home-page: https://www.github.com/flask-restful/flask-restful/ +Author: Twilio API Team +Author-email: help@twilio.com +License: BSD +Project-URL: Source, https://github.com/flask-restful/flask-restful +Platform: any +Classifier: Framework :: Flask +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: License :: OSI Approved :: BSD License +License-File: LICENSE +License-File: AUTHORS.md +Requires-Dist: aniso8601 (>=0.82) +Requires-Dist: Flask (>=0.8) +Requires-Dist: six (>=1.3.0) +Requires-Dist: pytz +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/RECORD new file mode 100644 index 00000000..f54d1128 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/RECORD @@ -0,0 +1,28 @@ +Flask_RESTful-0.3.10.dist-info/AUTHORS.md,sha256=HBq00z_VgMI2xfwfUobrU16_qamdouMkpNxbR0BzaVg,1992 +Flask_RESTful-0.3.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_RESTful-0.3.10.dist-info/LICENSE,sha256=PFjoO0Jk5okmshAgMix5-RZTC0sFT_EJWpC_CtQcCyM,1485 +Flask_RESTful-0.3.10.dist-info/METADATA,sha256=eTeg3NLzPPlJxKSMhedGPPQvRaQm-9lMafpxwIddLT8,1018 +Flask_RESTful-0.3.10.dist-info/RECORD,, +Flask_RESTful-0.3.10.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_RESTful-0.3.10.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110 +Flask_RESTful-0.3.10.dist-info/top_level.txt,sha256=lNpWPlejgBAtMhCUwz_FTyJH12ul1mBZ-Uv3ZK1HiGg,14 +flask_restful/__init__.py,sha256=KDyCbekXcfGMyV6E7neY6ZJ8b8GdM6eLtJbtRmn_nL8,28624 +flask_restful/__pycache__/__init__.cpython-312.pyc,, +flask_restful/__pycache__/__version__.cpython-312.pyc,, +flask_restful/__pycache__/fields.cpython-312.pyc,, +flask_restful/__pycache__/inputs.cpython-312.pyc,, +flask_restful/__pycache__/reqparse.cpython-312.pyc,, +flask_restful/__version__.py,sha256=JbZfv76t9J7HHmoA2wdjKemYHpQE0jhBfMJIil6HEsg,46 +flask_restful/fields.py,sha256=43GbFejZ3kiOb20A1QuzLXjevfsxMZSbmpOpGtW56vo,13018 +flask_restful/inputs.py,sha256=561w8fjLqBq4I_7yXPHJM567ijWhpuf8d8uZnKzTehA,9118 +flask_restful/representations/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +flask_restful/representations/__pycache__/__init__.cpython-312.pyc,, +flask_restful/representations/__pycache__/json.cpython-312.pyc,, +flask_restful/representations/json.py,sha256=swKwnbt7v2ioHfHkqhqbzIu_yrcP0ComlSl49IGFJOo,873 +flask_restful/reqparse.py,sha256=-xZmkyrvDFfGvFFokTtXe4J-2PWnNX4EfKolhkT995E,14681 +flask_restful/utils/__init__.py,sha256=jgedvOLGeTk4Sqox4WHE_vAFLP0T_PrLHO4PXaqFqxw,723 +flask_restful/utils/__pycache__/__init__.cpython-312.pyc,, +flask_restful/utils/__pycache__/cors.cpython-312.pyc,, +flask_restful/utils/__pycache__/crypto.cpython-312.pyc,, +flask_restful/utils/cors.py,sha256=cZiqaHhIn0w66spRoSIdC-jIn4X_b6OlVms5eGF4Ess,2084 +flask_restful/utils/crypto.py,sha256=q3PBvAYMJYybbqqQlKNF_Pqeyo9h3x5jFJuVqtEA5bA,996 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/WHEEL new file mode 100644 index 00000000..f771c29b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/top_level.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/top_level.txt new file mode 100644 index 00000000..f7b85270 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/Flask_RESTful-0.3.10.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_restful diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA new file mode 100644 index 00000000..82261f2a --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA @@ -0,0 +1,92 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 3.0.2 +Summary: Safely add untrusted strings to HTML/XML markup. +Maintainer-email: Pallets +License: Copyright 2010 Pallets + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source, https://github.com/pallets/markupsafe/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-File: LICENSE.txt + +# MarkupSafe + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +## Examples + +```pycon +>>> from markupsafe import Markup, escape + +>>> # escape replaces special characters and wraps in Markup +>>> escape("") +Markup('<script>alert(document.cookie);</script>') + +>>> # wrap in Markup to mark text "safe" and prevent escaping +>>> Markup("Hello") +Markup('hello') + +>>> escape(Markup("Hello")) +Markup('hello') + +>>> # Markup is a str subclass +>>> # methods and operators escape their arguments +>>> template = Markup("Hello {name}") +>>> template.format(name='"World"') +Markup('Hello "World"') +``` + +## Donate + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD new file mode 100644 index 00000000..8e0da81b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD @@ -0,0 +1,15 @@ +MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-3.0.2.dist-info/METADATA,sha256=aAwbZhSmXdfFuMM-rEHpeiHRkBOGESyVLJIuwzHP-nw,3975 +MarkupSafe-3.0.2.dist-info/RECORD,, +MarkupSafe-3.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +MarkupSafe-3.0.2.dist-info/WHEEL,sha256=T94HOVPNbYE6jyG6QmiIglWJ01nwJvHIWFgubY8hhjc,109 +MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=sr-U6_27DfaSrj5jnHYxWN-pvhM27sjlDplMDPZKm7k,13214 +markupsafe/__pycache__/__init__.cpython-312.pyc,, +markupsafe/__pycache__/_native.cpython-312.pyc,, +markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210 +markupsafe/_speedups.c,sha256=O7XulmTo-epI6n2FtMVOrJXl8EAaIwD2iNYmBI5SEoQ,4149 +markupsafe/_speedups.cpython-312-darwin.so,sha256=LAX7ul6PQsfO_zZxF631eSzN6U7PoGVTR_Wwd2pGav8,50624 +markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL new file mode 100644 index 00000000..edd13a08 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: false +Tag: cp312-cp312-macosx_11_0_arm64 + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt new file mode 100644 index 00000000..75bf7292 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/LICENSE b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/LICENSE new file mode 100644 index 00000000..dfe1a4d8 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright 2005-2025 SQLAlchemy authors and contributors . + +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/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/METADATA new file mode 100644 index 00000000..4a21885b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/METADATA @@ -0,0 +1,243 @@ +Metadata-Version: 2.2 +Name: SQLAlchemy +Version: 2.0.37 +Summary: Database Abstraction Library +Home-page: https://www.sqlalchemy.org +Author: Mike Bayer +Author-email: mike_mp@zzzcomputing.com +License: MIT +Project-URL: Documentation, https://docs.sqlalchemy.org +Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +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 :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Database :: Front-Ends +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: importlib-metadata; python_version < "3.8" +Requires-Dist: greenlet!=0.4.17; python_version < "3.14" and (platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32")))))) +Requires-Dist: typing-extensions>=4.6.0 +Provides-Extra: asyncio +Requires-Dist: greenlet!=0.4.17; extra == "asyncio" +Provides-Extra: mypy +Requires-Dist: mypy>=0.910; extra == "mypy" +Provides-Extra: mssql +Requires-Dist: pyodbc; extra == "mssql" +Provides-Extra: mssql-pymssql +Requires-Dist: pymssql; extra == "mssql-pymssql" +Provides-Extra: mssql-pyodbc +Requires-Dist: pyodbc; extra == "mssql-pyodbc" +Provides-Extra: mysql +Requires-Dist: mysqlclient>=1.4.0; extra == "mysql" +Provides-Extra: mysql-connector +Requires-Dist: mysql-connector-python; extra == "mysql-connector" +Provides-Extra: mariadb-connector +Requires-Dist: mariadb!=1.1.10,!=1.1.2,!=1.1.5,>=1.0.1; extra == "mariadb-connector" +Provides-Extra: oracle +Requires-Dist: cx_oracle>=8; extra == "oracle" +Provides-Extra: oracle-oracledb +Requires-Dist: oracledb>=1.0.1; extra == "oracle-oracledb" +Provides-Extra: postgresql +Requires-Dist: psycopg2>=2.7; extra == "postgresql" +Provides-Extra: postgresql-pg8000 +Requires-Dist: pg8000>=1.29.1; extra == "postgresql-pg8000" +Provides-Extra: postgresql-asyncpg +Requires-Dist: greenlet!=0.4.17; extra == "postgresql-asyncpg" +Requires-Dist: asyncpg; extra == "postgresql-asyncpg" +Provides-Extra: postgresql-psycopg2binary +Requires-Dist: psycopg2-binary; extra == "postgresql-psycopg2binary" +Provides-Extra: postgresql-psycopg2cffi +Requires-Dist: psycopg2cffi; extra == "postgresql-psycopg2cffi" +Provides-Extra: postgresql-psycopg +Requires-Dist: psycopg>=3.0.7; extra == "postgresql-psycopg" +Provides-Extra: postgresql-psycopgbinary +Requires-Dist: psycopg[binary]>=3.0.7; extra == "postgresql-psycopgbinary" +Provides-Extra: pymysql +Requires-Dist: pymysql; extra == "pymysql" +Provides-Extra: aiomysql +Requires-Dist: greenlet!=0.4.17; extra == "aiomysql" +Requires-Dist: aiomysql>=0.2.0; extra == "aiomysql" +Provides-Extra: aioodbc +Requires-Dist: greenlet!=0.4.17; extra == "aioodbc" +Requires-Dist: aioodbc; extra == "aioodbc" +Provides-Extra: asyncmy +Requires-Dist: greenlet!=0.4.17; extra == "asyncmy" +Requires-Dist: asyncmy!=0.2.4,!=0.2.6,>=0.2.3; extra == "asyncmy" +Provides-Extra: aiosqlite +Requires-Dist: greenlet!=0.4.17; extra == "aiosqlite" +Requires-Dist: aiosqlite; extra == "aiosqlite" +Requires-Dist: typing_extensions!=3.10.0.1; extra == "aiosqlite" +Provides-Extra: sqlcipher +Requires-Dist: sqlcipher3_binary; extra == "sqlcipher" + +SQLAlchemy +========== + +|PyPI| |Python| |Downloads| + +.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI + +.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI - Python Version + +.. |Downloads| image:: https://static.pepy.tech/badge/sqlalchemy/month + :target: https://pepy.tech/project/sqlalchemy + :alt: PyPI - Downloads + + +The Python SQL Toolkit and Object Relational Mapper + +Introduction +------------- + +SQLAlchemy is the Python SQL toolkit and Object Relational Mapper +that gives application developers the full power and +flexibility of SQL. SQLAlchemy provides a full suite +of well known enterprise-level persistence patterns, +designed for efficient and high-performing database +access, adapted into a simple and Pythonic domain +language. + +Major SQLAlchemy features include: + +* An industrial strength ORM, built + from the core on the identity map, unit of work, + and data mapper patterns. These patterns + allow transparent persistence of objects + using a declarative configuration system. + Domain models + can be constructed and manipulated naturally, + and changes are synchronized with the + current transaction automatically. +* A relationally-oriented query system, exposing + the full range of SQL's capabilities + explicitly, including joins, subqueries, + correlation, and most everything else, + in terms of the object model. + Writing queries with the ORM uses the same + techniques of relational composition you use + when writing SQL. While you can drop into + literal SQL at any time, it's virtually never + needed. +* A comprehensive and flexible system + of eager loading for related collections and objects. + Collections are cached within a session, + and can be loaded on individual access, all + at once using joins, or by query per collection + across the full result set. +* A Core SQL construction system and DBAPI + interaction layer. The SQLAlchemy Core is + separate from the ORM and is a full database + abstraction layer in its own right, and includes + an extensible Python-based SQL expression + language, schema metadata, connection pooling, + type coercion, and custom types. +* All primary and foreign key constraints are + assumed to be composite and natural. Surrogate + integer primary keys are of course still the + norm, but SQLAlchemy never assumes or hardcodes + to this model. +* Database introspection and generation. Database + schemas can be "reflected" in one step into + Python structures representing database metadata; + those same structures can then generate + CREATE statements right back out - all within + the Core, independent of the ORM. + +SQLAlchemy's philosophy: + +* SQL databases behave less and less like object + collections the more size and performance start to + matter; object collections behave less and less like + tables and rows the more abstraction starts to matter. + SQLAlchemy aims to accommodate both of these + principles. +* An ORM doesn't need to hide the "R". A relational + database provides rich, set-based functionality + that should be fully exposed. SQLAlchemy's + ORM provides an open-ended set of patterns + that allow a developer to construct a custom + mediation layer between a domain model and + a relational schema, turning the so-called + "object relational impedance" issue into + a distant memory. +* The developer, in all cases, makes all decisions + regarding the design, structure, and naming conventions + of both the object model as well as the relational + schema. SQLAlchemy only provides the means + to automate the execution of these decisions. +* With SQLAlchemy, there's no such thing as + "the ORM generated a bad query" - you + retain full control over the structure of + queries, including how joins are organized, + how subqueries and correlation is used, what + columns are requested. Everything SQLAlchemy + does is ultimately the result of a developer-initiated + decision. +* Don't use an ORM if the problem doesn't need one. + SQLAlchemy consists of a Core and separate ORM + component. The Core offers a full SQL expression + language that allows Pythonic construction + of SQL constructs that render directly to SQL + strings for a target database, returning + result sets that are essentially enhanced DBAPI + cursors. +* Transactions should be the norm. With SQLAlchemy's + ORM, nothing goes to permanent storage until + commit() is called. SQLAlchemy encourages applications + to create a consistent means of delineating + the start and end of a series of operations. +* Never render a literal value in a SQL statement. + Bound parameters are used to the greatest degree + possible, allowing query optimizers to cache + query plans effectively and making SQL injection + attacks a non-issue. + +Documentation +------------- + +Latest documentation is at: + +https://www.sqlalchemy.org/docs/ + +Installation / Requirements +--------------------------- + +Full documentation for installation is at +`Installation `_. + +Getting Help / Development / Bug reporting +------------------------------------------ + +Please refer to the `SQLAlchemy Community Guide `_. + +Code of Conduct +--------------- + +Above all, SQLAlchemy places great emphasis on polite, thoughtful, and +constructive communication between users and developers. +Please see our current Code of Conduct at +`Code of Conduct `_. + +License +------- + +SQLAlchemy is distributed under the `MIT license +`_. + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/RECORD new file mode 100644 index 00000000..b103ae0e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/RECORD @@ -0,0 +1,530 @@ +SQLAlchemy-2.0.37.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +SQLAlchemy-2.0.37.dist-info/LICENSE,sha256=mCFyC1jUpWW2EyEAeorUOraZGjlZ5mzV203Z6uacffw,1100 +SQLAlchemy-2.0.37.dist-info/METADATA,sha256=U0OcluY6KNHDIczc03PmWkLp1DGtzongNDkQ6THEvDo,9641 +SQLAlchemy-2.0.37.dist-info/RECORD,, +SQLAlchemy-2.0.37.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +SQLAlchemy-2.0.37.dist-info/WHEEL,sha256=VujM3ypTCyUW6hcTDdK2ej0ARVMxlU1Djlh_zWnDgqk,109 +SQLAlchemy-2.0.37.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 +sqlalchemy/__init__.py,sha256=m8AoRzqL1l_3uFAeJ_vwtlAfXkboxLKJ3oL1RqFnXbM,13033 +sqlalchemy/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/__pycache__/events.cpython-312.pyc,, +sqlalchemy/__pycache__/exc.cpython-312.pyc,, +sqlalchemy/__pycache__/inspection.cpython-312.pyc,, +sqlalchemy/__pycache__/log.cpython-312.pyc,, +sqlalchemy/__pycache__/schema.cpython-312.pyc,, +sqlalchemy/__pycache__/types.cpython-312.pyc,, +sqlalchemy/connectors/__init__.py,sha256=YeSHsOB0YhdM6jZUvHFQFwKqNXO02MlklmGW0yCywjI,476 +sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/connectors/__pycache__/aioodbc.cpython-312.pyc,, +sqlalchemy/connectors/__pycache__/asyncio.cpython-312.pyc,, +sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc,, +sqlalchemy/connectors/aioodbc.py,sha256=KT9xi2xQ4AJgDiGPTV5h_5qi9dummmenKAvWelwza3w,5288 +sqlalchemy/connectors/asyncio.py,sha256=00claZADdFUh2iQmlpqoLhLTBxK0i79Mwd9WZqUtleM,6138 +sqlalchemy/connectors/pyodbc.py,sha256=GsW9bD0H30OMTbGDx9SdaTT_ujgpxP7TM4rfhIzD4mo,8501 +sqlalchemy/cyextension/__init__.py,sha256=4npVIjitKfUs0NQ6f3UdQBDq4ipJ0_ZNB2mpKqtc5ik,244 +sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/cyextension/collections.cpython-312-darwin.so,sha256=AUXZEG2TY_w3DMw8RA2WSWZn2x_6IklKaeFcRwIiQA4,247360 +sqlalchemy/cyextension/collections.pyx,sha256=L7DZ3DGKpgw2MT2ZZRRxCnrcyE5pU1NAFowWgAzQPEc,12571 +sqlalchemy/cyextension/immutabledict.cpython-312-darwin.so,sha256=oqPbXAJAZtkweKQPRwVKtTI8rZd29x5Abkir-w5oNGM,122336 +sqlalchemy/cyextension/immutabledict.pxd,sha256=3x3-rXG5eRQ7bBnktZ-OJ9-6ft8zToPmTDOd92iXpB0,291 +sqlalchemy/cyextension/immutabledict.pyx,sha256=KfDTYbTfebstE8xuqAtuXsHNAK0_b5q_ymUiinUe_xs,3535 +sqlalchemy/cyextension/processors.cpython-312-darwin.so,sha256=wDjerlhJKxI2jQ3F_cM8XFcCinXyo1iPtEylBvO2uVQ,102928 +sqlalchemy/cyextension/processors.pyx,sha256=R1rHsGLEaGeBq5VeCydjClzYlivERIJ9B-XLOJlf2MQ,1792 +sqlalchemy/cyextension/resultproxy.cpython-312-darwin.so,sha256=VVnne-Rcw-CFq1POMU9YRbavz4cPM9nB2NEohXIAFdA,104864 +sqlalchemy/cyextension/resultproxy.pyx,sha256=eWLdyBXiBy_CLQrF5ScfWJm7X0NeelscSXedtj1zv9Q,2725 +sqlalchemy/cyextension/util.cpython-312-darwin.so,sha256=2iZ-_NtEVw9E656_SGOS4MUDiXdKqEMXeIgfT-9mtcg,122296 +sqlalchemy/cyextension/util.pyx,sha256=B85orxa9LddLuQEaDoVSq1XmAXIbLKxrxpvuB8ogV_o,2530 +sqlalchemy/dialects/__init__.py,sha256=4jxiSgI_fVCNXcz42gQYKEp0k07RAHyQN4ZpjaNsFUI,1770 +sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/dialects/__pycache__/_typing.cpython-312.pyc,, +sqlalchemy/dialects/_typing.py,sha256=8YwrkOa8IvmBojwwegbL5mL_0UAuzdqYiKHKANpvHMw,971 +sqlalchemy/dialects/mssql/__init__.py,sha256=6t_aNpgbMLdPE9gpHYTf9o6QfVavncztRLbr21l2NaY,1880 +sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/dialects/mssql/__pycache__/aioodbc.cpython-312.pyc,, +sqlalchemy/dialects/mssql/__pycache__/base.cpython-312.pyc,, +sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-312.pyc,, +sqlalchemy/dialects/mssql/__pycache__/json.cpython-312.pyc,, +sqlalchemy/dialects/mssql/__pycache__/provision.cpython-312.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-312.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-312.pyc,, +sqlalchemy/dialects/mssql/aioodbc.py,sha256=4CmhwIkZrabpG-r7_ogRVajD-nhRZSFJ0Swz2d0jIHM,2021 +sqlalchemy/dialects/mssql/base.py,sha256=2UCotpN3WBPgMddhXVP6Epc-srvNrYHCnK4kcEbjW6w,132713 +sqlalchemy/dialects/mssql/information_schema.py,sha256=v5MZz1FN72THEwF_u3Eh_2vnWdFE13RYydOioMMcuvU,8084 +sqlalchemy/dialects/mssql/json.py,sha256=F53pibuOVRzgDtjoclOI7LnkKXNVsaVfJyBH1XAhyDo,4756 +sqlalchemy/dialects/mssql/provision.py,sha256=P1tqxZ4f6Oeqn2gNi7dXl82LRLCg1-OB4eWiZc6CHek,5593 +sqlalchemy/dialects/mssql/pymssql.py,sha256=C7yAs3Pw81W1KTVNc6_0sHQuYlJ5iH82vKByY4TkB1g,4097 +sqlalchemy/dialects/mssql/pyodbc.py,sha256=CnO7KDWxbxb7AoZhp_PMDBvVSMuzwq1h4Cav2IWFWDo,27173 +sqlalchemy/dialects/mysql/__init__.py,sha256=ropOMUWrAcL-Q7h-9jQ_tb3ISAFIsNRQ8YVXvn0URl0,2206 +sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/provision.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc,, +sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc,, +sqlalchemy/dialects/mysql/aiomysql.py,sha256=yrujoFtAG0QvtVlgbGBUMg3kXeXlIH62tvyYTCMUfnE,10013 +sqlalchemy/dialects/mysql/asyncmy.py,sha256=rmVSf86VYxgAUROIKfVtvS-grG9aPBiLY_Gu0KJMjuo,10081 +sqlalchemy/dialects/mysql/base.py,sha256=LkGJ6G1U2xygOawOtQYBfTipGh8MuiE1kNxaD7S9UIY,123432 +sqlalchemy/dialects/mysql/cymysql.py,sha256=KwxSsF4a6uUd6yblhSns8uj4hgmhv4hFInTZNdmRixA,2300 +sqlalchemy/dialects/mysql/dml.py,sha256=VjnTobe_SBNF2RN6tvqa5LOn-9x4teVUyzUedZkOmdc,7768 +sqlalchemy/dialects/mysql/enumerated.py,sha256=qI5gnBYhxk9dhPeUfGiijp0qT2Puazdp27-ba_38uWQ,8447 +sqlalchemy/dialects/mysql/expression.py,sha256=3PEKPwYIZ8mVXkjUgHaj_efPBYuBNWZSnfUcJuoZddA,4121 +sqlalchemy/dialects/mysql/json.py,sha256=W31DojiRypifXKVh3PJSWP7IHqFoeKwzLl-0CJH6QRI,2269 +sqlalchemy/dialects/mysql/mariadb.py,sha256=g4v4WQuXHn556Nn6k-RgvPrmfCql1R46fIEk6UEx0U8,1450 +sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=t4m6kfYBoURjNXRxlEsRajjvArNDc4lmaFGxHQh7VTo,8623 +sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=gdNOGdRqvnCbLZpKjpubu_0tGRQ5Tn_2TZvbp3v9rX0,5729 +sqlalchemy/dialects/mysql/mysqldb.py,sha256=5ME7B0WI9G8tw5482YBejDg38uVMXR2oUasNDOCsAqQ,9526 +sqlalchemy/dialects/mysql/provision.py,sha256=5LCeInPvyEbGuzxSs9rnnLYkMsFpW3IJ8lC-sjTfKnk,3575 +sqlalchemy/dialects/mysql/pymysql.py,sha256=osp0em1s3Cip5Vpcj-PeaH7btHEInorO-qs351muw3Q,4082 +sqlalchemy/dialects/mysql/pyodbc.py,sha256=ZiFNJQq2qiOTzTZLmNJQ938EnS1ItVsNDa3fvNEDqnI,4298 +sqlalchemy/dialects/mysql/reflection.py,sha256=eGV9taua0nZS_HsHyAy6zjcHEHFPXmFdux-bUmtOeWs,22834 +sqlalchemy/dialects/mysql/reserved_words.py,sha256=C9npWSuhsxoVCqETxCQ1zE_UEgy4gfiHw9zI5dPkjWI,9258 +sqlalchemy/dialects/mysql/types.py,sha256=w68OASMw04xkyAc0_GtXkuEhhVqlR6LTwaOch4KaAFQ,24343 +sqlalchemy/dialects/oracle/__init__.py,sha256=rp9qPRNQAk1Yq_Zhe7SsUH8EvFgNOAh8XOF17Lkxpyo,1493 +sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/dialects/oracle/__pycache__/base.cpython-312.pyc,, +sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-312.pyc,, +sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-312.pyc,, +sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-312.pyc,, +sqlalchemy/dialects/oracle/__pycache__/provision.cpython-312.pyc,, +sqlalchemy/dialects/oracle/__pycache__/types.cpython-312.pyc,, +sqlalchemy/dialects/oracle/base.py,sha256=_JF4OwXmXjAsXj8wXq2m8M2vtMjoxdlOwg1hfcgn3bc,123096 +sqlalchemy/dialects/oracle/cx_oracle.py,sha256=ohENTgLxGUfobRH3K8KdeZgBRPG1rX3vY-ph9blj-2g,56612 +sqlalchemy/dialects/oracle/dictionary.py,sha256=J7tGVE0KyUPZKpPLOary3HdDq1DWd29arF5udLgv8_o,19519 +sqlalchemy/dialects/oracle/oracledb.py,sha256=veqto1AUIbSxRmpUQin0ysMV8Y6sWAkzXt7W8IIl118,33771 +sqlalchemy/dialects/oracle/provision.py,sha256=ga1gNQZlXZKk7DYuYegllUejJxZXRKDGa7dbi_S_poc,8313 +sqlalchemy/dialects/oracle/types.py,sha256=axN6Yidx9tGRIUAbDpBrhMWXE-C8jSllFpTghpGOOzU,9058 +sqlalchemy/dialects/postgresql/__init__.py,sha256=kD8W-SV5e2CesvWg2MQAtncXuZFwGPfR_UODvmRXE08,3892 +sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/array.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/base.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/json.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/types.cpython-312.pyc,, +sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=szME-lCjVwqnW9-USA6e8ke8N_bN3IbqnIm_oZruvqc,5696 +sqlalchemy/dialects/postgresql/array.py,sha256=28kndSQwgvNWlO4z6MUh5WYAtNSgkgBa6qSEQCIflks,13856 +sqlalchemy/dialects/postgresql/asyncpg.py,sha256=ysIDXcGT3OG2lu0YdiIn-_pzfL0uDe-tmHs70fOWVVE,41283 +sqlalchemy/dialects/postgresql/base.py,sha256=otAswEHqeRhbN9_AGMxnwDo6r872ECkiJ5FMetXfS0k,179452 +sqlalchemy/dialects/postgresql/dml.py,sha256=2SmyMeYveAgm7OnT_CJvwad2nh8BP37yT6gFs8dBYN8,12126 +sqlalchemy/dialects/postgresql/ext.py,sha256=MtN4IU5sRYvoY-E8PTltJ1CuIGb-aCwY2pHMPJcTboA,16318 +sqlalchemy/dialects/postgresql/hstore.py,sha256=wR4gmvfQWPssHwYTXEsPJTb4LkBS6x4e4XXE6smtDH4,11934 +sqlalchemy/dialects/postgresql/json.py,sha256=9sHFGTRFyNbLsANrVYookw9NOJwIPTsEBRNIOUOzOGw,11612 +sqlalchemy/dialects/postgresql/named_types.py,sha256=TEWaBCjuHM2WJoQNrQErQ6f_bUkWypGJfW71wzVJXWc,17572 +sqlalchemy/dialects/postgresql/operators.py,sha256=ay3ckNsWtqDjxDseTdKMGGqYVzST6lmfhbbYHG_bxCw,2808 +sqlalchemy/dialects/postgresql/pg8000.py,sha256=RAykzZuO3Anr6AsyK2JYr7CPb2pru6WtkrX2phCyCGU,18638 +sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=lgJMn7aDuJI2XeHddLkge5NFy6oB2-aDSn8A47QpwAU,9254 +sqlalchemy/dialects/postgresql/provision.py,sha256=7pg9-nOnaK5XBzqByXNPuvi3rxtnRa3dJxdSPVq4eeA,5770 +sqlalchemy/dialects/postgresql/psycopg.py,sha256=k7zXsJj35aOXCrhsbMxwTQX5JWegrqirFJ1Hgbq-GjQ,23326 +sqlalchemy/dialects/postgresql/psycopg2.py,sha256=1KXw9RzsQEAXJazCBywdP5CwLu-HsCSDAD_Khc_rPTM,32032 +sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=nKilJfvO9mJwk5NRw5iZDekKY5vi379tvdUJ2vn5eyQ,1756 +sqlalchemy/dialects/postgresql/ranges.py,sha256=fnaj4YgCQGO-G_S4k5ea8bYMH7SzggKJdUX5qfaNp4Y,32978 +sqlalchemy/dialects/postgresql/types.py,sha256=sjb-m-h49lbLBFh0P30G8BWgf_aKNiNyVwWEktugwRw,7286 +sqlalchemy/dialects/sqlite/__init__.py,sha256=6Xcz3nPsl8lqCcZ4-VzPRmkMrkKgAp2buKsClZelU7c,1182 +sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/base.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/json.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-312.pyc,, +sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=FWS-Nn2jnpITQKGd4xOZCYEW-l1C_erQ3IdDJC855t8,12348 +sqlalchemy/dialects/sqlite/base.py,sha256=PvwPzukomHAkufUzSqgfJcbKC2ZJAkJbVnW2BQB2T58,98271 +sqlalchemy/dialects/sqlite/dml.py,sha256=4N8qh06RuMphLoQgWw7wv5nXIrka57jIFvK2x9xTZqg,9138 +sqlalchemy/dialects/sqlite/json.py,sha256=A62xPyLRZxl2hvgTMM92jd_7jlw9UE_4Y6Udqt-8g04,2777 +sqlalchemy/dialects/sqlite/provision.py,sha256=iLJyeQSy8pfr9lwEu4_d4O_CI4OavAtkNeRi3qqys1U,5632 +sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=di8rYryfL0KAn3pRGepmunHyIRGy-4Hhr-2q_ehPzss,5371 +sqlalchemy/dialects/sqlite/pysqlite.py,sha256=rg7F1S2UOhUu6Y1xNVaqF8VbA-FsRY_Y_XpGTpkKpGs,28087 +sqlalchemy/dialects/type_migration_guidelines.txt,sha256=-uHNdmYFGB7bzUNT6i8M5nb4j6j9YUKAtW4lcBZqsMg,8239 +sqlalchemy/engine/__init__.py,sha256=EF4haWCPu95WtWx1GzcHRJ_bBmtJMznno3I2TQ-ZIHE,2818 +sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/_py_row.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/_py_util.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/base.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/create.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/default.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/events.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/mock.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/processors.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/result.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/row.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/strategies.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/url.cpython-312.pyc,, +sqlalchemy/engine/__pycache__/util.cpython-312.pyc,, +sqlalchemy/engine/_py_processors.py,sha256=7QxgkVOd5h1Qd22qFh-pPZdM7RBRzNjj8lWAMWrilcI,3744 +sqlalchemy/engine/_py_row.py,sha256=yNdrZe36yw6mO7x0OEbG0dGojH7CQkNReIwn9LMUPUs,3787 +sqlalchemy/engine/_py_util.py,sha256=LdpbNRQIrJo3EkmiwNkM5bxGUf4uWuL5uS_u-zHadWc,2484 +sqlalchemy/engine/base.py,sha256=9kCWrDp3ECOlQ7BHK_efYAILo3-emcPSk4F8AFRgN7E,122901 +sqlalchemy/engine/characteristics.py,sha256=PepmGApo1sL01dS1qtSbmHplu9ZCdtuSegiGI7L7NZY,4765 +sqlalchemy/engine/create.py,sha256=4gFkqV7fgJbI1906DC4zDgFFX1-xJQ96GIHIrQuc-w4,33217 +sqlalchemy/engine/cursor.py,sha256=6KIZqlwWMUMv02w_el4uNYFMYcfc7eWbkAxW27UyDLE,76305 +sqlalchemy/engine/default.py,sha256=SHM6boxcDNk7MW_Eyd0zCb557Eqf8KTdX1iTUbS0DLw,84705 +sqlalchemy/engine/events.py,sha256=4_e6Ip32ar2Eb27R4ipamiKC-7Tpg4lVz3txabhT5Rc,37400 +sqlalchemy/engine/interfaces.py,sha256=fGmcrBt8yT78ty0R3e3XUvsPh7XYDU_b1JW3QhK_MwY,113029 +sqlalchemy/engine/mock.py,sha256=_aXG1xzj_TO5UWdz8IthPj1ZJ8IlhsKw6D9mmFN_frQ,4181 +sqlalchemy/engine/processors.py,sha256=XK32bULBkuVVRa703u4-SrTCDi_a18Dxq1M09QFBEPw,2379 +sqlalchemy/engine/reflection.py,sha256=_v9zCy3h28hN4KKIUTc5_7KJv7argSgi8A011b_iCdc,75383 +sqlalchemy/engine/result.py,sha256=rgny4qFLmpj80GSdFK35Dpgc3Qk2tc3eJPpahGWVR-M,77622 +sqlalchemy/engine/row.py,sha256=BPtAwsceiRxB9ANpDNM24uQ1M_Zs0xFkSXoKR_I8xyY,12031 +sqlalchemy/engine/strategies.py,sha256=-0rieXY-iXgV83OrJZr-wozFFQn3amKKHchQ6kL-r7A,442 +sqlalchemy/engine/url.py,sha256=gaEeSEJCD0nVEb8J02rIMASrd5L2wYdq5ZXJaj7szVI,31069 +sqlalchemy/engine/util.py,sha256=4OmXwFlmnq6_vBlfUBHnz5LrI_8bT3TwgynX4wcJfnw,5682 +sqlalchemy/event/__init__.py,sha256=ZjVxFGbt9neH5AC4GFiUN5IG2O4j6Z9v2LdmyagJi9w,997 +sqlalchemy/event/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/event/__pycache__/api.cpython-312.pyc,, +sqlalchemy/event/__pycache__/attr.cpython-312.pyc,, +sqlalchemy/event/__pycache__/base.cpython-312.pyc,, +sqlalchemy/event/__pycache__/legacy.cpython-312.pyc,, +sqlalchemy/event/__pycache__/registry.cpython-312.pyc,, +sqlalchemy/event/api.py,sha256=NetgcQfbURaZzoxus7_801YDG_LJ7PYqaC3T1lws114,8111 +sqlalchemy/event/attr.py,sha256=YhPXVBPj63Cfyn0nS6h8Ljq0SEbD3mtAZn9HYlzGbtw,20751 +sqlalchemy/event/base.py,sha256=OevVb82IrUoVgFRrjH4b5GquS5pjFHOgzWAxPwwTKMY,15127 +sqlalchemy/event/legacy.py,sha256=lGafKAOF6PY8Bz0AqhN9Q6n-lpXqFLwdv-0T6-UBpow,8227 +sqlalchemy/event/registry.py,sha256=MNEMyR8HZhzQFgxk4Jk_Em6nXTihmGXiSIwPdUnalPM,11144 +sqlalchemy/events.py,sha256=VBRvtckn9JS3tfUfi6UstqUrvQ15J2xamcDByFysIrI,525 +sqlalchemy/exc.py,sha256=AjFBCrOl_V4vQdGegn72Y951RSRMPL6T5qjxnFTGFbM,23978 +sqlalchemy/ext/__init__.py,sha256=BkTNuOg454MpCY9QA3FLK8td7KQhD1W74fOEXxnWibE,322 +sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/associationproxy.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/automap.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/baked.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/compiler.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/horizontal_shard.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/hybrid.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/indexable.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/instrumentation.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/mutable.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/orderinglist.cpython-312.pyc,, +sqlalchemy/ext/__pycache__/serializer.cpython-312.pyc,, +sqlalchemy/ext/associationproxy.py,sha256=VhOFB1vB8hmDYQP90_VdpPI9IFzP3NENkG_eDKziVoI,66062 +sqlalchemy/ext/asyncio/__init__.py,sha256=kTIfpwsHWhqZ-VMOBZFBq66kt1XeF0hNuwOToEDe4_Y,1317 +sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/ext/asyncio/__pycache__/base.cpython-312.pyc,, +sqlalchemy/ext/asyncio/__pycache__/engine.cpython-312.pyc,, +sqlalchemy/ext/asyncio/__pycache__/exc.cpython-312.pyc,, +sqlalchemy/ext/asyncio/__pycache__/result.cpython-312.pyc,, +sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-312.pyc,, +sqlalchemy/ext/asyncio/__pycache__/session.cpython-312.pyc,, +sqlalchemy/ext/asyncio/base.py,sha256=2YQ-nKaHbAm--7q6vbxbznzdwT8oPwetwAarKyu2O8E,8930 +sqlalchemy/ext/asyncio/engine.py,sha256=fe_RZrO-5DiiEgMZ3g-Lti-fdaR7z_Q8gDfPUf-30EY,48198 +sqlalchemy/ext/asyncio/exc.py,sha256=npijuILDXH2p4Q5RzhHzutKwZ5CjtqTcP-U0h9TZUmk,639 +sqlalchemy/ext/asyncio/result.py,sha256=zhhXe13vMT7OfdfGXapgtn4crtiqqctRLb3ka4mmGXY,30477 +sqlalchemy/ext/asyncio/scoping.py,sha256=4f7MX3zUd-4rA8A5wd7j0_GlqCSUxdOPfYd7BBIxkJI,52587 +sqlalchemy/ext/asyncio/session.py,sha256=2wxu06UtJGyf-be2edMFkcK4eLMh8xuGmsAlGRj0YPM,63166 +sqlalchemy/ext/automap.py,sha256=n88mktqvExwjqfsDu3yLIA4wbOIWUpQ1S35Uw3X6ffQ,61675 +sqlalchemy/ext/baked.py,sha256=w3SeRoqnPkIhPL2nRAxfVhyir2ypsiW4kmtmUGKs8qo,17753 +sqlalchemy/ext/compiler.py,sha256=f7o4qhUUldpsx4F1sQoUvdVaT2BhiemqNBCF4r_uQUo,20889 +sqlalchemy/ext/declarative/__init__.py,sha256=SuVflXOGDxx2sB2QSTqNEvqS0fyhOkh3-sy2lRsSOLA,1818 +sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc,, +sqlalchemy/ext/declarative/extensions.py,sha256=yHUPcztU-5E1JrNyELDFWKchAnaYK6Y9-dLcqyc1nUI,19531 +sqlalchemy/ext/horizontal_shard.py,sha256=vouIehpQAuwT0HXyWyynTL3m_gcBuLcB-X8lDB0uQ8U,16691 +sqlalchemy/ext/hybrid.py,sha256=DkvNGtiQYzlEBvs1rYEDXhM8vJEXXh_6DMigsHH9w4k,52531 +sqlalchemy/ext/indexable.py,sha256=_dTOgCS96jURcQd9L-hnUMIJDe9KUMyd9gfH57vs078,11065 +sqlalchemy/ext/instrumentation.py,sha256=iCp89rvfK7buW0jJyzKTBDKyMsd06oTRJDItOk4OVSw,15707 +sqlalchemy/ext/mutable.py,sha256=7Zyh2kQq2gm3J_JwsddinIXk7qUuKWbPzRZOmTultEk,37560 +sqlalchemy/ext/mypy/__init__.py,sha256=yVNtoBDNeTl1sqRoA_fSY3o1g6M8NxqUVvAHPRLmFTw,241 +sqlalchemy/ext/mypy/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/ext/mypy/__pycache__/apply.cpython-312.pyc,, +sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-312.pyc,, +sqlalchemy/ext/mypy/__pycache__/infer.cpython-312.pyc,, +sqlalchemy/ext/mypy/__pycache__/names.cpython-312.pyc,, +sqlalchemy/ext/mypy/__pycache__/plugin.cpython-312.pyc,, +sqlalchemy/ext/mypy/__pycache__/util.cpython-312.pyc,, +sqlalchemy/ext/mypy/apply.py,sha256=v_Svc1WiBz9yBXqBVBKoCuPGN286TfVmuuCVZPlbyzo,10591 +sqlalchemy/ext/mypy/decl_class.py,sha256=Nuca4ofHkASAkdqEQlULYB7iLm_KID7Mp384seDhVGg,17384 +sqlalchemy/ext/mypy/infer.py,sha256=29vgn22Hi8E8oIZL6UJCBl6oipiPSAQjxccCEkVb410,19367 +sqlalchemy/ext/mypy/names.py,sha256=hn889DD1nlF0f3drsKi5KSGTG-JefJ2UJrrIQ4L8QWA,10479 +sqlalchemy/ext/mypy/plugin.py,sha256=9YHBp0Bwo92DbDZIUWwIr0hwXPcE4XvHs0-xshvSwUw,9750 +sqlalchemy/ext/mypy/util.py,sha256=CuW2fJ-g9YtkjcypzmrPRaFc-rAvQTzW5A2-w5VTANg,9960 +sqlalchemy/ext/orderinglist.py,sha256=MROa19cm4RZkWXuUuqc1029r7g4HrAJRc17fTHeThvI,14431 +sqlalchemy/ext/serializer.py,sha256=_z95wZMTn3G3sCGN52gwzD4CuKjrhGMr5Eu8g9MxQNg,6169 +sqlalchemy/future/__init__.py,sha256=R1h8VBwMiIUdP3QHv_tFNby557425FJOAGhUoXGvCmc,512 +sqlalchemy/future/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/future/__pycache__/engine.cpython-312.pyc,, +sqlalchemy/future/engine.py,sha256=2nJFBQAXAE8pqe1cs-D3JjC6wUX2ya2h2e_tniuaBq0,495 +sqlalchemy/inspection.py,sha256=qKEKG37N1OjxpQeVzob1q9VwWjBbjI1x0movJG7fYJ4,5063 +sqlalchemy/log.py,sha256=e_ztNUfZM08FmTWeXN9-doD5YKW44nXxgKCUxxNs6Ow,8607 +sqlalchemy/orm/__init__.py,sha256=BICvTXpLaTNe2AiUaxnZHWzjL5miT9fd_IU-ip3OFNk,8463 +sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/base.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/collections.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/context.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/events.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/exc.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/identity.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/loading.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/properties.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/query.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/session.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/state.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/sync.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/util.cpython-312.pyc,, +sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc,, +sqlalchemy/orm/_orm_constructors.py,sha256=NiAagQ1060QYS9n5y_gzPvHQQz44EN1dVtamGVtde6E,103626 +sqlalchemy/orm/_typing.py,sha256=vaYRl4_K3n-sjc9u0Rb4eWWpBOoOi92--OHqaGogRvA,4973 +sqlalchemy/orm/attributes.py,sha256=e_U0A4TGWAzL3yXVvk9YVhIRjKM4RTsIE2PNRLn8LbU,92534 +sqlalchemy/orm/base.py,sha256=oCgscNoRrqHwYvc1Iz8ZFhoVXhalu45g9z0m_7_ldaE,27502 +sqlalchemy/orm/bulk_persistence.py,sha256=Ciea9MhJ6ZbAi-uGy5-Kj6lodO9bfRqPq8GSf2qFshE,72663 +sqlalchemy/orm/clsregistry.py,sha256=syn6bB-Ylx-juh5GDCmNrPZ58C-z6sdwRkbZFeKysQU,17974 +sqlalchemy/orm/collections.py,sha256=XxZC8d9UX9E2R-WlNH198OPWRPmpLuYt0Y26LrdbuHc,52252 +sqlalchemy/orm/context.py,sha256=eyh7xTo3SyxIHl8_NBUqJ_GpJ0kZtmnTt32Z67cfqgs,112973 +sqlalchemy/orm/decl_api.py,sha256=SJ25fQjjKyWZDQbq5S69eiybpOzns0LkRziP10iW5-E,64969 +sqlalchemy/orm/decl_base.py,sha256=ZlZmyNVOsCPA_pThMeXuWmAhlJwlvTxdGXhnARsKxhk,83288 +sqlalchemy/orm/dependency.py,sha256=4NMhoogevOiX1Wm5B1_yY2u9MHYlIjJNNoEVRE0yLwA,47631 +sqlalchemy/orm/descriptor_props.py,sha256=LgfdiO_U5uznq5ImenfbWGV5T47bH4b_ztbzB4B7FsU,37231 +sqlalchemy/orm/dynamic.py,sha256=Z4GpcVL8rM8gi0bytQOZXw-_kKi-sExbRWGjU30dK3g,9816 +sqlalchemy/orm/evaluator.py,sha256=PKrUW1zEOvmv1XEgc_hBdYqNcyk4zjWr_rJhCEQBFIc,12353 +sqlalchemy/orm/events.py,sha256=OZtTCpI-DVaE6CY16e42GUVpci1U1GjdNO76xU-Tj5Y,127781 +sqlalchemy/orm/exc.py,sha256=zJgAIofYsWKjktqO5MFxze95GlJASziEOJJx-P5_wOU,7413 +sqlalchemy/orm/identity.py,sha256=5NFtF9ZPZWAOmtOqCPyVX2-_pQq9A5XeN2ns3Wirpv8,9249 +sqlalchemy/orm/instrumentation.py,sha256=WhElvvOWOn3Fuc-Asc5HmcKDX6EzFtBleLJKPZEc5A0,24321 +sqlalchemy/orm/interfaces.py,sha256=W6ADDLOixmm4tnSnUP_I9HFLj9MCO2bODk_WTNjkZGA,48797 +sqlalchemy/orm/loading.py,sha256=6Rd1hWtBPm7SfCUpjPQrcoUg_DSCcfhO8Qhz7SScjRE,58277 +sqlalchemy/orm/mapped_collection.py,sha256=FAqaTlOUCYqdws2KR_fW0T8mMWIrLuAxJGU5f4W1aGs,19682 +sqlalchemy/orm/mapper.py,sha256=-gkJKHeAJmIFT153WFIIySduyyLGbT5plCgSfnsa0I0,171668 +sqlalchemy/orm/path_registry.py,sha256=-aAEhGkDf_2ZUXmHQICQNOa4Z5xhTlhlYLag7eoVpxE,25920 +sqlalchemy/orm/persistence.py,sha256=Uz45Cwxi7FnNiSk2crbh3TzV7b9kb85vmcvOwy5NVmw,61701 +sqlalchemy/orm/properties.py,sha256=vbx_YiSjj3tI94-G-_ghbyWYcIIJQQeGG1P-0RC8Jv4,29065 +sqlalchemy/orm/query.py,sha256=GI_go9ErXYK1BteCmIh5E9iv-jfMJkRBVIlw0XmnYyk,118540 +sqlalchemy/orm/relationships.py,sha256=C40n_-oliMgJJ0FHfwsi1-dm963CrYeKJ5HEYjLdg_o,128899 +sqlalchemy/orm/scoping.py,sha256=-SNRAewfMJ4x4Um8X-yv0k1Thz8E1_kCBmbmG1l1auo,78617 +sqlalchemy/orm/session.py,sha256=1fzksIcb9DtKcwqkS1KkZngkrEYGUHmoNW_o6l8IXQ4,196114 +sqlalchemy/orm/state.py,sha256=1vtlz674sGFmwZ8Ih9TdrslA-0nhU2G52WgV-FoG2j0,37670 +sqlalchemy/orm/state_changes.py,sha256=XJLYYhTZu7nA6uD7xupbLZ9XSzqLYwrDJgW0ZAWvVGE,6815 +sqlalchemy/orm/strategies.py,sha256=qziXv4z2bJeF2qFSj6wogc9BLlxuOnT8nOcEvocVf88,119866 +sqlalchemy/orm/strategy_options.py,sha256=wMYd4E_nRb5ei8Fr3jWeSewNY2k1-AfqtYRGOLiHOFA,85043 +sqlalchemy/orm/sync.py,sha256=RdoxnhvgNjn3Lhtoq4QjvXpj8qfOz__wyibh0FMON0A,5779 +sqlalchemy/orm/unitofwork.py,sha256=hkSIcVonoSt0WWHk019bCDEw0g2o2fg4m4yqoTGyAoo,27033 +sqlalchemy/orm/util.py,sha256=rtClCjtg0eSSC8k-L30W0v6BauJaJuh9Nf-MSqofWuQ,80831 +sqlalchemy/orm/writeonly.py,sha256=R-MVxYDw0ZQ795H21yBtgGSZXWUzSovcb_SO1mv5hoI,22305 +sqlalchemy/pool/__init__.py,sha256=niqzCv2uOZT07DOiV2inlmjrW3lZyqDXGCjnOl1IqJ4,1804 +sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/pool/__pycache__/base.cpython-312.pyc,, +sqlalchemy/pool/__pycache__/events.cpython-312.pyc,, +sqlalchemy/pool/__pycache__/impl.cpython-312.pyc,, +sqlalchemy/pool/base.py,sha256=mT-PHTlVUGcYRVsMB9LQwNgndjhOTOorWX5-hNRi2FM,52236 +sqlalchemy/pool/events.py,sha256=wdFfvat0fSrVF84Zzsz5E3HnVY0bhL7MPsGME-b2qa8,13149 +sqlalchemy/pool/impl.py,sha256=MLSh83SGNNtZZgZvA-5tvTIT8Dz7U95Bgt8HO_oR1Ps,18944 +sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/schema.py,sha256=yt4dcuMAKMleUHVidsAVAsm-JPpASFZXP2xM3pmzYHY,3194 +sqlalchemy/sql/__init__.py,sha256=Y-bZ25Zf-bxqsF2zUkpRGTjFuozNNVQHxUJV3Qmaq2M,5820 +sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/_py_util.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/base.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/crud.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/dml.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/elements.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/events.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/expression.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/functions.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/naming.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/operators.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/roles.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/schema.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/util.cpython-312.pyc,, +sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc,, +sqlalchemy/sql/_dml_constructors.py,sha256=JF_XucNTfAk6Vz9fYiPWOgpIGtUkDj6VPILysLcrVhk,3795 +sqlalchemy/sql/_elements_constructors.py,sha256=eoQhkoRH0qox171ZSODyxxhj_HZEhO64rSowaN-I-v4,62630 +sqlalchemy/sql/_orm_types.py,sha256=0zeMit-V4rYZe-bB9X3xugnjFnPXH0gmeqkJou9Fows,625 +sqlalchemy/sql/_py_util.py,sha256=4KFXNvBq3hhfrr-A1J1uBml3b3CGguIf1dat9gsEHqE,2173 +sqlalchemy/sql/_selectable_constructors.py,sha256=fwVBsDHHWhngodBG205nvhM-Tb3uR1srbCnN3mPgrjA,18785 +sqlalchemy/sql/_typing.py,sha256=zYKlxXnUW_KIkGuBmBnzj-vFG1QON8_F9JN1dl9KSiM,12771 +sqlalchemy/sql/annotation.py,sha256=qHUEwbdmMD3Ybr0ez-Dyiw9l9UB_RUMHWAUIeO_r3gE,18245 +sqlalchemy/sql/base.py,sha256=kfmVNRimU5z6X6OKqMLMs1bDCFQ47BeyF_MZc23nkjY,73848 +sqlalchemy/sql/cache_key.py,sha256=ET2OIQ6jZK2FSxsdnCvhLCrNJ2Fp3zipQ-gvINgAjhQ,33668 +sqlalchemy/sql/coercions.py,sha256=lRciS5agnpVvx_vHYxJV-aN6QOVb_O4yCnMZ0s07GUE,40750 +sqlalchemy/sql/compiler.py,sha256=eT_zrKvApimVfycvcTdubQK8-QAzGHm5xWKdhOgnWUY,274965 +sqlalchemy/sql/crud.py,sha256=vFegNw5557ayS4kv761zh0bx0yikEKh1ovMrhErHelg,56514 +sqlalchemy/sql/ddl.py,sha256=rfb7gDvLmn_ktgH2xiXLRTczqnMOED1eakXuGuRPklg,45641 +sqlalchemy/sql/default_comparator.py,sha256=uXLr8B-X6KbybwTjLjZ2hN-WZAvqoMhZ-DDHJX7rAUw,16707 +sqlalchemy/sql/dml.py,sha256=oTW8PB-55qf6crAkbxh2JD-TvkT3MO1zqkKDrt5-2c8,65611 +sqlalchemy/sql/elements.py,sha256=RYq5N-IEPnhcDKtokeaCDIGZiUex8oDgwRLCDqjkk_g,176482 +sqlalchemy/sql/events.py,sha256=iWjc_nm1vClDBLg4ZhDnY75CkBdnlDPSPe0MGBSmbiM,18312 +sqlalchemy/sql/expression.py,sha256=rw5tAm8vbd5Vm4MofTZ0ZcXsphz4z9xO_exy-gem6TM,7586 +sqlalchemy/sql/functions.py,sha256=tbBxIeAqLV3kc1YDxyt68mxw0fFy6e93ctRUZSuuf3I,63858 +sqlalchemy/sql/lambdas.py,sha256=h9sPCETBgAanLtVHQsRPHeY-hTEjM5nscq3m4bDstwM,49196 +sqlalchemy/sql/naming.py,sha256=BU0ZdSzXXKHTPhoaKMWJ3gPMoeZSJJe9-3YDYflmjJw,6858 +sqlalchemy/sql/operators.py,sha256=h5bgu31gukGdsYsN_0-1C7IGAdSCFpBxuRjOUnu1Two,76792 +sqlalchemy/sql/roles.py,sha256=drAeWbevjgFAKNcMrH_EuJ-9sSvcq4aeXwAqMXXZGYw,7662 +sqlalchemy/sql/schema.py,sha256=WKKwxkC9oNRHN-B4s35NkWcr5dvavccKf-_1t35Do8A,229896 +sqlalchemy/sql/selectable.py,sha256=5Za7eh4USrgVwJgQGVX1bb2w1qXcy-hGzGpWNPbhf68,237610 +sqlalchemy/sql/sqltypes.py,sha256=yXHvZXfZJmaRvMoX4_jXqazAev33pk0Ltwl5c-D5Ha4,128609 +sqlalchemy/sql/traversals.py,sha256=7GALHt5mFceUv2SMUikIdAb9SUcSbACqhwoei5rPkxc,33664 +sqlalchemy/sql/type_api.py,sha256=wdi3nmOBRdhG6L1z21V_PwQGB8CIRouMdNKoIzJA4Zo,84440 +sqlalchemy/sql/util.py,sha256=G-2ZI6rZ7XxVu5YXaVvLrApeAk5VwSG4C--lqtglgGE,48086 +sqlalchemy/sql/visitors.py,sha256=URpw-GxxUkwjEDbD2xXJGyFJavG5lN6ISoY34JlYRS8,36319 +sqlalchemy/testing/__init__.py,sha256=GgUEqxUNCxg-92_GgBDnljUHsdCxaGPMG1TWy5tjwgk,3160 +sqlalchemy/testing/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/assertions.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/assertsql.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/asyncio.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/config.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/engines.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/entities.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/exclusions.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/pickleable.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/profiling.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/provision.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/requirements.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/schema.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/util.cpython-312.pyc,, +sqlalchemy/testing/__pycache__/warnings.cpython-312.pyc,, +sqlalchemy/testing/assertions.py,sha256=RFTkxGq-kDvn3JSUuT_6bU1y0vtoI6pE6ryZgV2YEx4,31439 +sqlalchemy/testing/assertsql.py,sha256=cmhtZrgPBjrqIfzFz3VBWxVNvxWoRllvmoWcUCoqsio,16817 +sqlalchemy/testing/asyncio.py,sha256=QsMzDWARFRrpLoWhuYqzYQPTUZ80fymlKrqOoDkmCmQ,3830 +sqlalchemy/testing/config.py,sha256=HySdB5_FgCW1iHAJVxYo-4wq5gUAEi0N8E93IC6M86Q,12058 +sqlalchemy/testing/engines.py,sha256=c1gFXfpo5S1dvNjGIL03mbW2eVYtUD_9M_ZEfQO2ArM,13414 +sqlalchemy/testing/entities.py,sha256=KdgTVPSALhi9KkAXj2giOYl62ld-1yZziIDBSV8E3vw,3354 +sqlalchemy/testing/exclusions.py,sha256=jzVrBXqyQlyMgvfChMjJOd0ZtReKgkJ4Ik-0mkWe6KM,12460 +sqlalchemy/testing/fixtures/__init__.py,sha256=e5YtfSlkKDRuyIZhEKBCycMX5BOO4MZ-0d97l1JDhJE,1198 +sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/testing/fixtures/__pycache__/base.cpython-312.pyc,, +sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-312.pyc,, +sqlalchemy/testing/fixtures/__pycache__/orm.cpython-312.pyc,, +sqlalchemy/testing/fixtures/__pycache__/sql.cpython-312.pyc,, +sqlalchemy/testing/fixtures/base.py,sha256=y5iEEdUZIft06fvAOXwKU73ciIFTO5AVgDDGzYD9nOY,12256 +sqlalchemy/testing/fixtures/mypy.py,sha256=9fuJ90F9LBki26dVEVOEtRVXG2koaK803k4nukTnA8o,11973 +sqlalchemy/testing/fixtures/orm.py,sha256=3JJoYdI2tj5-LL7AN8bVa79NV3Guo4d9p6IgheHkWGc,6095 +sqlalchemy/testing/fixtures/sql.py,sha256=ht-OD6fMZ0inxucRzRZG4kEMNicqY8oJdlKbZzHhAJc,15900 +sqlalchemy/testing/pickleable.py,sha256=G3L0xL9OtbX7wThfreRjWd0GW7q0kUKcTUuCN5ETGno,2833 +sqlalchemy/testing/plugin/__init__.py,sha256=vRfF7M763cGm9tLQDWK6TyBNHc80J1nX2fmGGxN14wY,247 +sqlalchemy/testing/plugin/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-312.pyc,, +sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-312.pyc,, +sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-312.pyc,, +sqlalchemy/testing/plugin/bootstrap.py,sha256=VYnVSMb-u30hGY6xGn6iG-LqiF0CubT90AJPFY_6UiY,1685 +sqlalchemy/testing/plugin/plugin_base.py,sha256=TBWdg2XgXB6QgUUFdKLv1O9-SXMitjHLm2rNNIzXZhQ,21578 +sqlalchemy/testing/plugin/pytestplugin.py,sha256=0rRCp7RlnhJBg3gJEq0t0kJ-BCTQ34bqBE_lEQk5U3U,27656 +sqlalchemy/testing/profiling.py,sha256=SWhWiZImJvDsNn0rQyNki70xdNxZL53ZI98ihxiykbQ,10148 +sqlalchemy/testing/provision.py,sha256=6r2FTnm-t7u8MMbWo7eMhAH3qkL0w0WlmE29MUSEIu4,14702 +sqlalchemy/testing/requirements.py,sha256=MVuTKtZjeTZaYlrAU8XFIB1bhJA_AedqL_q7NwVEGiw,52956 +sqlalchemy/testing/schema.py,sha256=IImFumAdpzOyoKAs0WnaGakq8D3sSU4snD9W4LVOV3s,6513 +sqlalchemy/testing/suite/__init__.py,sha256=S8TLwTiif8xX67qlZUo5I9fl9UjZAFGSzvlptp2WoWc,722 +sqlalchemy/testing/suite/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_cte.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_insert.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_results.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_select.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_types.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-312.pyc,, +sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-312.pyc,, +sqlalchemy/testing/suite/test_cte.py,sha256=d3OWDBNhnAwlyAz_QhFk-vKSWaAI3mADVnqdtTWOuwI,6451 +sqlalchemy/testing/suite/test_ddl.py,sha256=MItp-votCzvahlRqHRagte2Omyq9XUOFdFsgzCb6_-g,12031 +sqlalchemy/testing/suite/test_deprecations.py,sha256=7C6IbxRmq7wg_DLq56f1V5RCS9iVrAv3epJZQTB-dOo,5337 +sqlalchemy/testing/suite/test_dialect.py,sha256=eGJFZCwKmLrIl66ZlkLLZf5Fq6bzWI174gQsJt2bY2c,22923 +sqlalchemy/testing/suite/test_insert.py,sha256=pR0VWMQ9JJPbnANE6634PzR0VFmWMF8im6OTahc4vsQ,18824 +sqlalchemy/testing/suite/test_reflection.py,sha256=EJvTjRDimw9k90zlI5VCkmCzf7Tv5VF9y4O3D8SZMFU,109648 +sqlalchemy/testing/suite/test_results.py,sha256=9FFBNLeXcNRIC9FHfEjFKwfV6w2Bb58ulml_M8Zdokg,16914 +sqlalchemy/testing/suite/test_rowcount.py,sha256=UVyHHQsU0TxkzV_dqCOKR1aROvIq7frKYMVjwUqLWfE,7900 +sqlalchemy/testing/suite/test_select.py,sha256=S81w-Dox6W29Tjmi6LIBJ4HuB5E8dDAzmePDm0PKTYo,61732 +sqlalchemy/testing/suite/test_sequence.py,sha256=DMqyJkL1o4GClrNjzoy7GDn_jPNPTZNvk9t5e-MVXeo,9923 +sqlalchemy/testing/suite/test_types.py,sha256=gPA6t-90Icnpj2ZzITwbqka1DB-rNOoh6_xS9dC-4HU,67805 +sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=0zVc2e3zbCQag_xL4b0i7F062HblHwV46JHLMweYtcE,6141 +sqlalchemy/testing/suite/test_update_delete.py,sha256=_OxH0wggHUqPImalGEPI48RiRx6mO985Om1PtRYOCzA,3994 +sqlalchemy/testing/util.py,sha256=KsUInolFBXUPIXVZKAdb_8rQrW8yW8OCtiA3GXuYRvA,14571 +sqlalchemy/testing/warnings.py,sha256=sj4vfTtjodcfoX6FPH_Zykb4fomjmgqIYj81QPpSwH8,1546 +sqlalchemy/types.py,sha256=m3I9h6xoyT7cjeUx5XCzmaE-GHT2sJVwECiuSJl75Ss,3168 +sqlalchemy/util/__init__.py,sha256=tYWkZV6PYVfEW32zt48FCLH12VyV_kaNUa3KBAOYpSM,8312 +sqlalchemy/util/__pycache__/__init__.cpython-312.pyc,, +sqlalchemy/util/__pycache__/_collections.cpython-312.pyc,, +sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc,, +sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc,, +sqlalchemy/util/__pycache__/_py_collections.cpython-312.pyc,, +sqlalchemy/util/__pycache__/compat.cpython-312.pyc,, +sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc,, +sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc,, +sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc,, +sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc,, +sqlalchemy/util/__pycache__/queue.cpython-312.pyc,, +sqlalchemy/util/__pycache__/tool_support.cpython-312.pyc,, +sqlalchemy/util/__pycache__/topological.cpython-312.pyc,, +sqlalchemy/util/__pycache__/typing.cpython-312.pyc,, +sqlalchemy/util/_collections.py,sha256=RbP4UixqNtRBUrl_QqYDiadVmELSVxxXm2drhvQaIKo,20078 +sqlalchemy/util/_concurrency_py3k.py,sha256=UtPDkb67OOVWYvBqYaQgENg0k_jOA2mQOE04XmrbYq0,9170 +sqlalchemy/util/_has_cy.py,sha256=3oh7s5iQtW9qcI8zYunCfGAKG6fzo2DIpzP5p1BnE8Q,1247 +sqlalchemy/util/_py_collections.py,sha256=irOg3nkzxmtdYfIS46un2cp0JqSiACI7WGQBg-BaEXU,16714 +sqlalchemy/util/compat.py,sha256=TdDfvL21VnBEdSUnjcx-F8XhmVFg9Mvyr67a4omWZAM,8760 +sqlalchemy/util/concurrency.py,sha256=eQVS3YDH3GwB3Uw5pbzmqEBSYTK90EbnE5mQ05fHERg,3304 +sqlalchemy/util/deprecations.py,sha256=L7D4GqeIozpjO8iVybf7jL9dDlgfTbAaQH4TQAX74qE,12012 +sqlalchemy/util/langhelpers.py,sha256=G67avnsStFbslILlbCHmsyAMnShS7RYftFr9a8uFDL8,65140 +sqlalchemy/util/preloaded.py,sha256=RMarsuhtMW8ZuvqLSuR0kwbp45VRlzKpJMLUe7p__qY,5904 +sqlalchemy/util/queue.py,sha256=w1ufhuiC7lzyiZDhciRtRz1uyxU72jRI7SWhhL-p600,10185 +sqlalchemy/util/tool_support.py,sha256=e7lWu6o1QlKq4e6c9PyDsuyFyiWe79vO72UQ_YX2pUA,6135 +sqlalchemy/util/topological.py,sha256=HcJgdCeU0XFIskgIBnTaHXfRXaulaEJRYRwKv4yPNek,3458 +sqlalchemy/util/typing.py,sha256=C4jF7QTNo0w0bjvcIqSSTOvoy8FttuZtyTzjiyoIzQQ,20920 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/WHEEL new file mode 100644 index 00000000..d37c50b5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.8.0) +Root-Is-Purelib: false +Tag: cp312-cp312-macosx_11_0_arm64 + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/top_level.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/top_level.txt new file mode 100644 index 00000000..39fb2bef --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/SQLAlchemy-2.0.37.dist-info/top_level.txt @@ -0,0 +1 @@ +sqlalchemy diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16e18713d069cd98a61c99e9d5e3fc9e914c526d GIT binary patch literal 41414 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 p;fF5sgi-9+v#$3>^*@A6G>|3A4JekK3_ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..743948e32355a1110cbd2d4ed8b3ff53be53b6fd GIT binary patch literal 139477 zcmdqK3tU{seJ{Q*U>6n^*ySMvVtGh_4CpP}l8}TzZwbi~cI>s~)rxbFK(H&HT_l0Q zmK`NQu@a-$j&NM{uO?r0)E@VqvrFDDb-rio>sHvmg-rnzT z=Dc<}_>rcc&;Rp3ADBI7-t(K8-~3)P^Jkfv=_WioSG<3CMW)5{cl4n=Ir7U)yVqno zZxT#`xy$6^zhFhVdmvPu6 zSiWiYIR&dPQ_S+Y#I#P7m;4B}qxYFiz8s5bt4T;XZ4y#nw(vN?d%Z2`LbEATfv-hGSxVR zbH>S1@%#lYaYdht!%^;7;;0nQu)C+|&xQke8%F&t%#BZ4$KcO|% zEOsSgFBH8AAvNf)8e!3;Dz&F8kzecV{CtZM^A<5(s8;$=T8Nl;8^o-Izt6zG4*r+} z$&ar-xEgtzJMT{pF`3|R>pVEy-#E6oOsSjNn&m|F!TxY2d#O{(T1i z4e;+b@Lxa2=w$d$$`njOEoSBh--hmuzKz|DzQ*oNzD<~=e<;)ex=rY@W{eVovcafS zXX$1(B9~x9){C1HM&uUckR_Pa9^8uWE$HvrRW)^fdkWpNL#?9Aehlo4o!4vtcRB=k9oX^*1#}<|gG@d?PJ{z!Nt^TH2 zxK+6Autm82uvu91tkt&*x$j0E&(6+Wf#ngCu=YiBUmDhqJ;FNl)?VSJ&~V!9yJL<% zU$0`M3$t_e?F%*w|0Zle`u)O2?ZUqjfE`K$RMp!Bejq25M-JN<1nxu~E*s=< zAN;>(;C}%AKQQpWAO3%A;O~e36$Af+@PEs|KLG!?4g3!UkBdGAx$S`54so9XUlp$R z$>BQ@zRMu|fE>OX;VlN?_sijX5Wd$S+%JdUf$)6>;RogL{RnRr_lZR`OJ>zFAji5B zvF@5P)*<0@=)E@KZl53uY&H6c0Zc@|>Zb<&?ePC|1OLOp0pT8u+?3Af>`{MdAa6q`f!=#SzAZpYm_%TCd%1(5* zn+23GGNB3I9hp44mar;a47%OARYN5|#RqL8<*gFN0YGFzeBc+5zT!9KI*S0UhoA5ORJ<9f|$- zK6LMZa1!l&Sm=d&ilyp9st1*leUC7|e)tXO@_$s!k%$L)2r$d{<%7C#vUm?8-YM}> zU5WW}TOLtzltA4NnLASrTJw1pVmAmmEw}Sgk~@LB~TLR*CK-&edSZv=t*6Tz9QG?Db(oeNj3T^ zO8=_xgm7M0qp!#{8cwRw0)rYo{;6y9w5~>v%QgBP)aaR{8V#ZJAz@f}R#&6P*;sfE zvA@A!Q$D*U3HYy6Zo%_OEvTHG&iA#TT`UzwbhZ1Moce{N)Qb#KKfzLeQD`U!J^h64>!qid-^;=!o!{5x_GqgnAKgn0YCZg^$I>ghS`N!&>Gx5~ zSCeY_G)jLOB-5C#M#I9leZMmYbT|#1!{EBwpoY%~e*oU2t>xbkpA){TYwt6{Wmbn}ESJ|mZ7wYK_YnL0Nws+%FnV72f%rQ* z7(FBWH!4HM^nVOYKjIq!rmvKH^9^-$W(!vk^97dso5=l*1bjad%wQpJv5-epEIuOV z^FuWsJ}R0GVE)aZU3gn85dK6gXtxP}dfMjurkwgmNvXFOq<%4I5#I5=D5v;wQi^Q` zDK4PApNLPQyeCoKpP{@9A3Iuj&372&^t-_?FuL__(609jKYcbu_?fsv_;dXKcl<~3 zA7dkJ*X*>+-(X~5ytEs|?!0ZbFYy~JpS`oggsaHOAWgf4@$$?SuJSKo+&C^EMC+76 z?qb1VGkS~Xl_gA^PWAn++yn0>^}xQ_b@N?hQZi$C?_bPS=Et|_(xg(Z?_22IZ=vqr zLhnwYcQ3MqYRj@j2TFfbDO3CP zy@`?cPk`W?bM!jbQSe?rt))}md~Xrg1xo*a0Sf=Dl;?Yk)gWE?--?e+(SA`$r~UeV z7|ax|qXuuYd_F)vYAW9k<$OL=^Wn76m$mfDn~&q7v&y&j>-*E-0$~PnR+>pR;Ra^O zpUB^Yy}qi&RNlmQ7!I@v|AM%GD%asxY8^N)sbj8`^y{h9C2Sd2dteyxk~Q}L&dIN+Zp{#5B%-%lJS@h6XX#Gm+nCOT2~ z=d`kwH{l~CHpUaR?;A>p_UrraEM!FUQQmw}7V=HyTl@9#mC69u`$k!s3tC*|&4)Dx zHTXT{Tl@84MM21@=A*p%CRoU~lyB|V_bv-D=r7-ofRR=FrAu)SOL0l_QQmxf75RPT zTl@7*vNU6wkMic5Vj)K5{G5dt$z9_t5 zW+6uM*1usPSCrhfU*9zr@|NbKy!n2?Lf%%swO`-g0@6k!e>+R@r&>(q&G&aKY0-(w*yT3qGL z_Yw=as(fp|zV}&(f%Mb&k1XUbw7ANf?|-t8Ddk)H_5D+?xxyr#tTaj4G+&K)0pE#x zOhb;dubeQQwBBPn@yYS~So}Xuif=QU;BPrwruf(V$NN-~mYVLkwK3Qmw>NbK!r{9D zQaqz66l@Db#326TDO);%fv$Mwu8xQ(1-kY}q>kX>xMOcX3Uu#3Cbq>h)z?Ppa5(N# zKX;x8kcVx**wr4lwe}tp<7wnl5l;D~wdYuu7*D-3cr4I%H123T5$K2n4#6w4G29z$ z+fHRhLX!TILLE&ZDby3`2#WD67ICW>lw-QtH(C%8PeyhJf`P-L6i?mM)839>d()9X zM{sxGSUf8!Mp{#-2T7!OO0)Ptj~LHr7TW_oU6JOFwn#j^CD1JjysjC0Bteu!fdx3I z8T>V4f6uXFAt@4WJQR*+Dj%DABO+j;d^Ux;(cY6<_?E6vAfkP44+;oXv)Ufih3!KH z1%N0R3`Ni}Lfnb&5~YYgC>}?>Gvu!b!P(W;B?csa2mvTS2*=$*AQEV!4)#Z+Krq}M zlDgyRf_O|4si%dwwK;^YJS;|ZiBj5G*W1aLb!9pWmpTr21mn5dd!WmIC=f+*x z3PnO~p)P;7*nLQp!tpHfrE2+)bOa;ecq*F3hFM2gjU0F4gW?DR0X$6}ZSk}g@dUv* zZdcmE-=q!!etYGj;u#WPfNHSDr%C9^j&3oYBft3Dj)-kX*|4&;VpPOgw>5Tk1kh8I zJ9}ltu#l}i0ZE9blE-$6anIh({-$l4n|5w**&0u2Vc@p6g!YM%9w`{N?-K*Uo?sVd z&^`>E4vdX>MoTE7ePBcY=xvexVkDl5sfIZew{HS$rQYp(FeU?CU958HO`)zXu`SXO z3epGnn3)GW|n=Y*vmt0yE?)EJ!Z!-n&KJq3rm@@I}m9*63^P*!=|Sa$0dL7 zr#TaB6XWTs2ddT*k|$BzzULUV3V0-KZyWZBU#|Y zZHGk63cRV0tZ_2UnomCquWL7`fEEj8A-!@pm|@Cu4uZAxS%HRV2IV+niB zHI|mX^mSo5?)rhL?y(F&&R|b_9h$*OKkqTX!$n-PpWr z2?kPMH(Do3OOA`d<4d|a4lOy>8#xjRuBczOd`TGCxQ=ip&|7#3hCO=B4{(XWFn|=U zKZeoh_e+@Het%!CTIG7hkJj*T3Y=4>DcAfNyqH=p+9*vBsLt-kpB` z13iH*9wL!}g+v^YMC^>zOHM>_&fz5trMv00X~tqsDduq~_@YHRhM)J-;UqvV6&?(7 z6zjYxqC&Ob1TB{QbP`yTo(QF6Pp4gZ(|&cKRAkcAZdJ(n{pgsMn$&oDN4O&xjs$2F zr*eSCGyU?E;h>R_ zrBg)Dh9zQGeh2^IIyk3H)2?|_&deuMC$lSK*_9XCCl}owTXg#mR!^?o8C$zE>e@A9 zwPdGXH(4C%46q7J9Y~!3Q|eg;)4TBU+k`a1>q|NmHV6Y9pfS78%HAw^vkjU~ntdtzO+agQKNhCl zgbtM)C`-zo!FwBCo-&^Yz`=~iW{luO#mVVP$fN=ZOP?QGD zxOz6qLiygd08uyIL!!4QEDGKe9g!nmZC+N_)Yw>y`2xOKlCXZIgnN!*k<9V?mFdft z0l&Y-Dv?AcZVesk1lIO*>c=0Z8hgE`IO3wQ*jJ>q9q2JB6XM*$i{N}jh|>LJ_{@XT z`K3|s-Q)T9M6>Uib{C$zHRi4z-9PSL7IiM0Jz`Y|E=MK?5H$CiH7s|=3}|68D}pNy zt2{$kp?Q?IMEpI&$ru^bUg-rmVd_MsjfAlKa&&Fv%fk05-h4P()20gQQY10jh z)v^3v)2)t0*G+I(DJ)VO!qrC^h%@Ez(hp_9Y&?h=Kmre-bYe^}TfKms=*8070U{SG zq&E=s_5?AXh#tcdF0cso>0bG%^U@&f2z%Q=ry~Vu6FvrsROvO042rr3yn#0o@*W8s z7rmh6yg=?pLP9tpUw9v9go{^~0^?j6Z((n!ol4gdfrJ#jkt2Z!%QJEWc^?81?8O=d zf(~>=*c*@#L+TN|w5}ko=sgw!iA`A@2fc@1wP}>9qm2WEO%N)yIYZ8Il$mjQP2+2Bl-q87t<26IjD^*xYaarumiB4pYD7 zg88dvJ|l_}aRrBAq=Oh48AC`U8e?-Ko(7smJb}S!i(A{ez>hLkCiN)ePWgBxbcG=x zS<7%k%>Nq8$O%jBLD@KHuI$!9Fxt2!lOBoniq<(}YQ>Cwx zA30a?ucJyinr0yYU5Z}{g(3+Jrt!cUya_Mo$)*WS_T!yD{b*)|jyTnpyLJmCIZV<* zaa2i*CGZho*m?w*MP)~5ty32|U=JBfVM2!zXDP!0>cpc-F6RNP!!eC+*(5F*ys;n# zYk}+pT~xOGso7`?ZMf$U3lfETFM8f9o(zzTVokalmyjci;@t!;e@%ivg>7VFf?3{z z*zOfVL9v>co*Hl6dT$H9W+$gC>gzSUN8h}-{XK`OsmPkyiRQ@M>#guIvcQWq4#F6K z=n%)-UK#1ls-{u#1})+>+9d|sXII9!_IuD(QZ=QhS@Rpzi!xO!+ls8PR)m3>6@<+j zM2i}*J&Fng`AZ>?LXi#;m>nsU&JRgyK4B571|oY89`yTJxB2}C4|>6pOC5)LXuSy` zs1-{Jd_zGNRU2&}q`<_enISG#yU+=>Mp$~J5E076>uVj_%D85wI0)>N(pXP1OpR%1 zmKkGCHq>LLN#y(u{==)_oHAXnO?Bi<6)hNSJiGI{)0CYvX#eO&hAF4?f+Ol${GrL_ z$hmGeW#&w|vIp(gGw^wH28)R4(XEH*=Rfc-3aLmGT9`${1tm5kz~R z5OzWxRZfnUi1VhyrU9U$X48QUCewgL$17VjDpKKfq~d;ar@E#hx%~87jJThd<+Z|W zI=ckvh^0(=`YpORjW$z+co6m^Q1|A(9gRVtGm`Rv1Un*jVNiM@aP-PTJ#U*Nf*1(} z*Ld5zNE#GWLO{`UhcKcw4jHuPX%rFn_~pb2tamDtcnBo6phX>`ic|=%M2JaKA|zPG zz)RQiil?&oaNK-MW&*sNO)v1v_3(E=tO6l7XVJsbpQ7kAz$LsLFQ-h`a@>QdQ#tc# zsFe*if?FRhn>KH(?7X479vg_- zxlCkMCs&||ncLv(G?~%Stdp_ep}WnxZdTc-cFWhz=gsIWx6RaRdc}Ie%vo0qL?U{@ z47`oJq(6bfnE|=29zP>P{a75h(2QCv5rvaO4W(NAlF>Oi1s|Hsj*`K~sa*Gyt;1zc zd~Rs*xU={JD?EQ4wjti5g+=Bz{Hl*Uf=n}o@Jbe*2^NUZY`sIn7!K?gY`WU4(f2y?BeoMdgD0plI8Srt+ znikIj>Asy7QKHgGwhpw*KrCHBO#uMLm!^b(h^2Tg!`*!R!cYy&tPsy-K?!~g;R;c7lfgsd`8fn@wj;Xopg%Sg8(6(kGa!B5;qY>IS=d}PtW6y6iC3BcVE z?1%u|dHQNGISP4~5gZDT3S|4d^1wm@N3z`ZfmNKFP8fxd-!Y#EH( zx}Y86SnOx;j9a_Jp!6oarAlHq@g0oirYV3$n=qX8Lki8pdc#+mV}TB612bhLhc%Wy zvxqm>t=bmD;rBy{h^49e1=Yg` zhSJ}gw{)y%eBQdj9q*Nt(QNM$JCGq-ET@Vkq;5)8r`_8i4%k zl6ACYyn5|b_u8q2RYNUP-ue$s*1TJXZBz40M;flqUpiI1c(Qm|ta#a2<=6w?u9_%b zGgVwOS-dn>ymZX-Zt?2tX^8%T-Q=x{de)A1Pk7c&mn|B3XuNFoxgGDht43|3o#XD? zqt4qux=~{ClzeEiWaj-M+jBhyzc(4h_*%xM#iq9wJ2tJhzO~8>7n+JBY=qS%B1wNq z@cw&pl2Fnl`H|x#;JEQ}+H~DwaojRuoq-3^!DYLF#FX>njj-~ZuGX@upY{3#8 zhpJf6NXn1nat$g9vHKc@JiT}20dIqMrN)*S#BW8ROzJ4}n~*ocT!8dS0&!lD=2aof zD&pl5nnc3N(8o3i8FR3#WSl)XK}IETPaUslP$_xExEDO-0iCcw&-$a@$sFd#)rPf> z^^_=ewD;1R+Lh{Trba^T4b>sKP438#%ar7J(4`YY8(=`JhlYdJ9H|aY0^Ol56IT$D zuuL#njbe96h)}Oa1Y=`Ef~1EKF+vFGBt3G7J;@uNMpWWD_(!soxD3@2|H&SpT05ay zeYk>jYb=3FR+Fh&(Nr^Li7+bJZeZ-TLuO6&kv`|wfEO(k4VKA&}K1vy2+>oIZI#KHt18qkX83Jm-lrbBX zYSnw^kQS*i)T~KX(-UdGt(pzrHB1bo$%7JPKcAfV5E<04)a-4|XG{)UnVeXyCj(_L z6s%Lh>8?@H!k4!w@YOOBGx7K=DuLOPdU2u%u>HU882B$+U>kpeX}2qdlI6_#{G$ z=c=h-dU2TOrCv>IMoHR20vS|fwS^!K!>Z5)B~&mZeHSPq?$QzqJ>A{CHI}%IijXcN zR8MtFx5I-uK3dZc2x%fSl=u*!!<_Ce}QU!9AXB-m1$B$R3DACKW>&RhrwQJ zKE^2sMGshv(RaT^%|#Oq%n_IJ=~N|JYK2r??8|^PJ*0u^Tg`31m}ZWlR*Wchz%T^6 zn7VE;lzoJrW$UPV>6gd=6x{px;RE9z>Fr^1{u)j^m7&NmIIw>vKkE6o9d zB;TY*VOh*3GLGu2Y$6jy20;ySSbS(@QYKG*3ph^#Q9OkiG$s?bH3*W(`3k{+R^C&l z_v}TJc5lq?eb-*jY7BV`u|krEoI-N;!$}ylR9n`L9e5$xTc_OF_*5UwzyU@i5SAg9 zK`XUbOjQ}T07F>f=^y}M8cH}kZijr5y^+wE(1uQE46`fPK?;m!lzxq(U!sPU;)R(X zJpS;RhleBMuF9*fb)%kFOD>j-MaFB^MeXZYOCcqdRd{+SX`9*tyx8QAnSFRk)Ts*= z>{YWp%gsYlPN(CPu~ZV-;dBUHo zZpTC+i`sCT0yg?p1xVk+2kD9<_~nl#`ZFThV12T5bShMPztl1dA z+PghIUoj*CKMUK=jy8XQ%ut#AtY$?;)^{OhW{btb?uT(SEXKmz)Pp!Zn6oIrtV!e2 z#8e(Xo~A@rOO^he>hb~{rUK>bt*q*%%pfT<7&WR0XN*SRLB#ur%(WI@YM-p%6vLlu z)3x&IA={I#DQ^{iGN-fi&ZWh&y(9Uf1(z$Yv_|)~Mzg&W*>^%GvtZF+^H*AKSWP+k zYMimil}Z+2>r}}?3g+lV?M;-Z68U^B!NxK3i)P4W5X7HP93eT7s;GUdq%z?UJO!JZ zO**l$Dmx0>FjgSHkqWg@)Tv5?w0!#6m{OPxAU0D(mGuBUWNR^%HyVTb_%+s+^)#rU zg=RB_1aFcBASc0$NixH!aY!b5{{jVlk>Xkdg21ptJe8~D;*gI(E=tG*113#=<*B)} zS^9`2#PSl)WJ)_x@H5<#C|8!!QBt3Gjsc+-@qNS!w<5<=rg-tz!QDyYBD-WVyDXMn zHc~s0y@a$Rl@qSgk(Hwjv5MQKv-2mj%VXK)`1Xv3-_2g}UUtE-?RnSJF8P~}13hg( zGnvN44E7J2zGO?FDvT5avQ$tof7zx<#|CY%e}mOqzqxtVnoc@3BOD_g(`1O6jtg-O z7(ylmyxSc$E4?o%aen zXuVNlU}4N?>07*4HT)$#ySxA}K}Xoz-4kYZk0d(^*C$XXga%jOe`W`qr_73e@IVo1 z2Q}TG5jov&KBJoK%KF0M1byK}uEYicp@R8FiHp{_rG6<>9mcKQ;ll|QlQ$jfsNyG& zN$dMo%z-CVfo%P{u25T`E4;p5P4p8&9i-^^h^ZN`7Hzp)_U!7(`E{}Rb)$hX_vHLl zv7#-%o}m%;d2faJrURTBC`CZ$W&yW=fI*xJJZ6@0)7BaadE>V30Jbq%+r<+%T`-M1 z47)rsk|WLYO~+bU66L*_0m;TmGExA|4tnJ@3XrFV($J zch$2*{=PtVQo$F3iAUZdS?FMj%&c+tPKk&7I z>7t5}$Vhv%wkcZKJYKXp>e&n{x~cr45#Lzlck8}gcXi>0r&nLOGg`EBDu3aKFml&* zlexBZs+R zaxNUFm5r^TAf6(}{B00!iCkj-BK7D6IC={_B4ZgX`zrMcDbrxLI<@k)%aL~u{mSHU zEc!6t?pS%+(QnjX{0;JIYQ1Ja$3j{$;pQk&sVk<(QY9aLn!;*<}3aNo8ef> z8f%|R-jqNx!TP|Vws<-jnj;fzHHqf{9Y89g+fu^F6zPws)GX``q3uA5(M7Ib-N(g= z3J@U+U^^KK0?d4G6OW*534(r@eEk8u3C)NEv&UxS|yP``XAaon~{7#P_=F-C9mHW zQJJOVX6XMGKr&&pHmIp!!m-q5I(rDZJ+f|1X?g!Y@T_N}g-9%EEgT4kV6g$=AQK^y zp-YM%T?XNk^fL;ENoltff=THBr6BPFNt;M$0KZ@H3^w20wCm31&CUMC*4BOdNg7St zH!f0O3L^!v9SX*F*hr`q#K=Y!o5{8ZZqmgi^|-VO*`=b=VZx{26r8TdHlNx&mF+&C zaV}%HX?P!K{SQs4Dc(WbREF#EhBFP(;uW!s6;n>nbbiUO5UpG_CXMH>8O)gSEFTii zcc1HydX|qIjd_-nB+5J3JcYTw=iHu=t?znj$2>pqUtP9qDm(AI7cSFi;gh-A>zuVE*7g+!Z>6)iiE}Czl!W&2Y?)?jkH% zv7a+?L@!QAV-pYtJ{tgtT(?U1I|a&&Z1{`L^G;j3Y6mcxyyasir<@I8qkl{FEf4H)o8W8X)(hEA#n`8(gSc3 zCO1KxLA@9+`pK;s)CuO}T&(u@ja+svTbnaI7dO0Q`X;`X%PcnZ8UipCbR4uxO=pTu za$w92mY8WZLZL3uS3DXsvkkXN9o^V|84;nEA`At(g4>X{iIDa}RhLeSH$5FN@8|Zh z2#^gTPaFwhU%>8td$^(sJ5?lZuv+Uqaijw}lkNbr<=Zz&0m*j5>MFRNz|jIO4mj7L z))31Cb&}KoN8g3TkPtwj0D*GbQM5BG?_=Qrk(v=3r+u5k9^?rDAk54PhI$@*C|b5Q z>RKDM8<^}+>C}NU&2Wr6#E6u{ULT@r*rN%#9yK$&kv^}o6&HIa)IB^Lrm|hWReA?$ zVZNf<^~=bsi+rDs^eqHSgz*#PoFx7TF(VUc8``>%+Ui9lpqLETknOQGlNse#Gs>rP z=SPdzkLPZPIyYRmnw%9MGyT^fd1AXYIf62M!*jJ3TR;QZQAz`g|oibF`*BsQTbD@>$4uSe@qaD_@ z5RXEsia%%vJK8%y!pio|kk=?9l?@HQUsF~z(e`K3aX={*I1B^>rF0Mn=7hu8ZiXpv zg7zqS!=$znLMKph{h;RqtyZmiID}yi#Z)L*74gEd6XZ2*JwcUNOk_=?l%fOg`Y|!&zZpMs7Y$cD8<}ubzDJ{d<9Kdk)Y*7F#gxtWX|*9|^+7`R%&f+b z-l&W=GILu@Zd4}N;FC(%JmA`hRM8HTvox5TIeP6i4s7pI=JjscUt*Ipr5_^NNL?~B zih4q3j?INftI=SWwyJ6d!-9p0N6f)zwW$_Sb2CCWM|9SiT0S^Z78}o)nN<%+GMHIK zv^7@C4}yf`=Tnz!W8~t}enY9ZroA^d*6JjhJ?S}YQjiME`GC$aOEvBS>DUn|P!d9r zlJbm2FR*~IHR-3=V{|TPCoQf?4;N1MTib2eJY|zNPuW@+Jtd~Ds=rp0vzDg0as2eYlmc6X62 z5Yh@H3)28(Yc!utEH%s!l{Qh1K#FYZR})R6*Abs-QHJ`iy2>uJjV^q#b8Oi+gHzd_ z>D;1cw>-b+={?b$+DqZFRWJ8l&AEN5xa>odBd2Jn`C4J|h5SqTuP(T_;0J|oul~`7 zH#bDR`>z)6hauSW4No^r)UKPX-59Ig2sXO(&C=+;*74dqug<@7dj6u3$h-4v-&;_1 z-C{1Sn5w86sRjvEQafX{mKI?b*Sw0T6bBhhH<*s9AlF?Y+A z<8Y!*SvZbns}C*4Y#IL|Ui8bE(QGoJU}tZxgD_kbmiL3T0yRs-0v;(xCni_vVkk~j zlAxCiNI}PLK^?b1#YsIY-9ZlN7`Vohcm$~i4wii4JLXvOS&F{=e1tHrd|0%;o+9i%`ncNu32|^|9DN~koDc{MIa8c zS8(D$L6OLeVKZv$%v-45tZmNu8ul>UP(h+TIXAsUdJ+tu(qO1Cw&BMTAP&T=Ks=nU z6M?FNMD&m*x>Q+6CV(XEXVN3x2f?I)5~7pL0Fxd;#YGV!CD{WN+uAv5q2el(U{LbQ zfFeDxvDfOGs^KsVqYG(*y@-icpHq!&A)tk9lRrk7?UVbUCS4whP>F)xRL+4>Fxkyr z+ZEc3HpwNh7-ZGRFd?jOv`y$6l`I&MLuadKls#~rN_!m%g^t2Rb)SNTKnT$ucCsqs zwp-Y;$4`ik$a4C~wU8iq~NKZkETo5VT14YKBl z<_i!o7jfQ)Jo`$M=WJ5FaMOh;Jc(q4hjX7ia^~Ubg87pLb+LlF(YCQw;{~@zvu`JT zkahU}(K{!yS4~AY+o2JT=#ZHtZ?UhO5!RMI9b0pR=;<=>W-+V zQqFDZ^wJg4mCfTzH(v?7V~H-^8C|mLokpPSd3zvtR0_IbSJCy-n0x7%drTa6uZudl z7CylopYS8YD}My|{MXm%l~B}}zL79U9u6U<>I^;)0{Nx@EDlBKdo z*}Y3)s&pn*#wF6-Gt#&44VZot zp5^c5mqIvSw$VIeG8Z(O@t)IYM$ByY;}4#BaMD#9bKy*kvFZueT1fw|70#b5tdAAK ze%_H;JY<9PDW_<1JSmEWB<3$^XnqVm4DLA(lisA6&k~?Bc?zmcU$CPIt zdC$9EfRxvBO@+lD-N-Z*E`mTRr|9SK&!WH_eB5N);RG4;|!d&(v* zi$qHm+cbqkLa1FjMwofeCiwVHEu59E?w*D6so`A1h+B6!NlQ(7vbyIbDv42@v?%fE zNid6BX@l~+6ndPT2g&Irr-kB?vyKY81zy;3kT;sNdR4zlB)NQ|TI?-exhQjb;p8C@u7qp*2CF zV$)U)s6$lh&8FUxI1yxM#AqDOTI`t_Rr`k7Qgeyk)wuVr28Xg^Pay#94wOZg_!D zuVyd2UV+lDSDLatoIOIV)d$UB&&*x;(VGp5R--{@M26s!QZwXC7D$<_K07;u%7!zj z9L#huoity3Nu{aTx+MYksI2Z9fRxz?;+H?{q!@I5zgamUh8bq6!$FA$+g_Em)%+NX zE4M9Nrm<%v8N*~V5F^dD9Rd@qPD;UsR0d_k3OPfY2uPt$RK!>Hg<8F&8u%NCk~G%L zC={!aQzKWp2|hn53%*RSC6}}d(kR-ZkXxtt z+Caxi^%c$ChBv6fr;+X>l1Sv7*&1^$9Em^}!Q>Diz989IcW&LJyCUYs9>cNCv{9&%o%rqVDWQ;6Kc^GnVxnar(;<<<AC1rV#G85Pqov;eFU+Tywo3unxD$P+%Y^7VObX&8O zGQ#eNDn2oqaY72eGErNc6gCNEWT1uY!CW?ALa;F3N|OwX&3q-MzC{qIrz*lAO`Oti zfvC6yIjSs+k`@@QM0;1>G#fN5l()mi0E;&m9x}jU4;Y?2Sk!9pO6xa2V-f6{Fs9%7 zD6HTHtPkOc36&*s1c+eX9gvQC1F9fImZPvO53;yK4by3U_V++V%482%Ye`$Eo`S?g zCCRGTMA3+<%rVfv;pmSp(umQyG)&^66+#CeYYH585EIj?vfUYMD^?v8!nD^8*6Kaj zvWP=KWPKKNQN7+U^u@IQOSeT6XBpw_wT`xOUqr zBh?#Dmd4??ZA|+~-;#VbvT{0}rr@K~<`AO;;DwSDus#gcJoJ3wGPSN;tlYP8HfWRq z#LCr;fW*Eh%_-?FV585>6yC@BW@1W^mcH680ko418-Y$`#Xx|@@d(cFgK|*KhKudI zeQwe*29$%hxNl81ogS+!Yg{M7G$HR(DNG8$P%NzyoY%MwNH6Zh(4y0Nv3fy?`ZEe- zGCC$Puq&2R%upxp*nF}L#vO<)3ktYFcLs!;O2oKXRF*DTCbyolBnTiTcOCpP>#kK)4O%Dc z-W$0lXZ}#zvkem&HJA2J)-}ZH8m<&wt=kFHgXOEflQ-Bj;jD-FO=0-cGdG)w<9Fn2 zHcyu?zI5x@ip#dk!uTysbPhw)l^(UTkcE#?Yb2)Z-xo$zPTZP z)2)`bZgn)}rToy8-ISg3!|W8iEA}eK(GzWmr#@EsZH54+SDcdCbk5x{Rxu5VQ`>2q zvHc*fKIxa2>CcFX7I6Dwr8Ae3Fz*4K8^QG-nCHyBmRIM2sob#aM z*ik<`@(Fn9SZT5ZV|n$tl{4qJ2P2H~LILxT%M4M|U`L$UY-Mi2_JRTUX!{h|i60Vi zt&9PRXDPMi!e6O_LQavB#6?qES%W<&CR~HB)23h8S2NP!n!`Eim>+Y@hs@TIGrXV9 z7Rn)O$>I;lgA)mqK^y+nhZ;@KZ>KNHkyGE|PwtC$I+Opm(;J|)T5x{-a0a zfO0fadW69FAnNyt-61`SsPPn*So(rNFHkEba!Qc#jM59Y8TCSsVJ}eH|H574@|*NVnw(tvvO#}PdnIxfA!~J3tTE`1 z5q9F%tXV;6{|o!Wi|jwmtYF*ie>=TF>=~>|Ig zlC>4M@eqw{=D8Ix`K;JpdI~L&Y2R4ht37J7&!K`j;HS9J@ zpU`cJI7>DV)lY$sp@1OP6Vn7649ILSCQDK2AV+U1tkf5xkiNiY=saBSgA)pWqwd2V zSOHhmM8XoAcor0`e`r)1P*OGW8E5AKXT1=Mq$P4?v$4W@gwqRLh`&pEAox*l&4gVF*-o*?NH1Z*mJnqGqilHy?KhFQSre<0Fa<)@ zxb0Z)v0mvb$PHWl>68!17O+JFdp2lO1~#GL%n=f{(PDr>!I;0S!~x3SAn{bL9J>&!ekVxOqNBuo5md(^^q}d&SkGp7G-P>53&|8RHe}K1i_^W({tGE;1)?sP+7Ta|cE?joQbv zm*MbKck!hAmYDmNi;XWgjd{l1t06MIR#89LJmK_Wm)YP>zCbgWS)>=yPU!+1HZ>1& z1{cOX1`UvY7tuaP)ut{+wQpF`Qwp!=Yr8_W#8dfpfP~>qGob?iGf>~kf^hv75p4)E z!MKW5Aa(a>mhrk+*hMR)(uo74MjJ2%@9QP4usYn4E?@iN!gZs3NQa5k4SJ0-ORMS- zJ~3@6(yF=)mR9}x#I&&QKl^!hyzF108Q^G_;zwFU&JuFAk+Yqgt#EJzf=k;z#LS!H zIXVydkOF-ivWZT#_@Br27m+N8T?WSP9wJ+J+?Vq*fbkG@EloClPHk51w0H67hH)GN7+GMaimARdESPE7W7kRmpsT-j!;-ai%S8(gHO2<8u6Qbw=?SVe zHVsAUP%3K1hG7A1vjyViWf(ZAMEdckKb4?Ik7mu-LtE7H`gJGj8flnWtZEJO>bHMD z_p0JuGApN&70juWC*^ATS)=@Mgl8IV>9!7}>DGlzURS-V)myM((_Y#)&6-l}95(9V zSWJ1%8NfFGe!EW1W;Yby+nB{VMBa$&P)gE-`TcfSMamOBoCaOAT@&hem=Kl0fRRy5bLc0W}+4Q*c z@ys@B2XyZTs!gW*P@@6oKxV&FLl;I?lKq+e8U6N7Rn)KLd?{T~EIeU3yV!;rQGUT& zKSMo=KU+N%D5AUtN_mkorAEql8OSp5a~b$$8~Ei283Va&-2a5eeSd0axst#3JK*kj zbP^qu^z^$stCGC%Dd5@>rRK_5hI%>cGvweD)QiS+Ik-MU4w;5IWPgSnvJ7*``3yO@ z40AAsS+S{Y`{RDkKBgE~nr$0{#SAGZbBlT)%K61{`;jSDd7Hk%2En`oAa;#h}R(~F9 zX*_Dul~@=RpD>3Hydlq+g5S6mxfpq*sZV4Fc*I!Yn8YDECqrH zSMjAT+@%XAc9}i8aCL+ty;lx4>B7}9hj10^C9E@UWzJxou_2a}-A`mGd-`+n zMPhRPg%h`!O_p^abHI5b;l0Ka*pB7CiLP1@z1RiA1Rb~#1_XtyLgZ%$>2#7{5O6jn zWF?&UU{VvXGSH1d9TsGp9T`DF0gARu6f{L1rH5K`c4V$y)LK!##oNAfB4W_RL;5s`U-Vp#EeRknb`T0wuozSFMa4*+R#gXrW`3PGBJDw34uy zOOS9#dGP3~NhCNS++bU$3`}%h0HGNsf`yytc~2V=554t*O`s8v_BVC#ETt@pw9rBF35t@XAq z!|$?MI`ws+W-ULWHlo{nN$`h(>F*)y7P=Eq(K`E&;+9+Rs9iZX%$>0EN~FhM^J=CovaE`5iry9zNz@H%rv!aTpa)|@qzPFijvK|W^W1N_d`6H1K;{fAnLPxj_ z_Y_Oiz0w5bLwg^j?~-$woY%>rBgE*KJI>3XqrL}^nnG^!{C!HbpJG^oVTn#)k;qJl z?fZ*6m6P*mO2yM~mJ4es*}V2EcX3a#SZO>jp4A@1h z^MN=)Wnw-_v(N@?01N+Y(>$ElYR%jNRXeV;7`8pJ=ED6~-O#kZz2!$OZ?;^$Z69rL zF_{-`CX4;~TgYNR4{i#jp+f`Qn6#G{PULQ!aBZCSE_x~Jg{)}l(sRyhrDa1-$Zv3j zPuIDw3+u<$L^rfvDTedYNNhuE^e(yxb8zcaX~p2y31{(?D}T~e5yK5_*kieDs_K@Z zG+3~`hg}A@Mk`lNxK~Zp)RWhuYemI_JHf4w;2^<8Q{|P>g{x!bw-OUxILv+!E^ z%8~Ms`(x!R$L<)XfNSNIL$0aZ{ew+^hZGM{x!u~k^76nl40}k za#+IU7Sn2Fl3u5_CCM+>D@z)YuWSV z)9-Gl;k&m+Tr!pLWk5?u)r==r;zG4SiL$8TtFB!@jnN{X{a+y<}vPsXvm}lWg@LkWU={)bqj#yrO zqVLc1iV{7pX^AF~NX^PS>8Xx+sz(=0c%VGjXMD|ruu4E{IFHF_V=w+G0p5HOrf6`b)(-giRG3pJtFX(UU4F^ErH%y*h`@t<(*2YKw-+!y>zU> zzVY1sQRjZy8e*0zlTf1c16mB8BS+iekz|a*7DsZPAUs)tRIpiHaqE?o8>XNcW+(@( zI6G|6{votwt!50rlKPl^9v3;Yq{Id=+9iQpLw+2RWEQI5KhzF=iE;r~y4GaChL*7~ zrQ>V7)X2UszL{!VuX3i(e`l%{(QmrGFnmtP6?mqyIGglbmhlj}Zd- zo>`NW^#JPq=2LqT{Uobk9!P;y%`%X}j9_sDBALPpDbJ-qI+B883{#)8^r!YAQz4C9 zNZ)9nu*ZnX>`&9g)q?$!Ly;kY_q7V?Juq>{Zw7uL0qeI3&UMI1NXO0-+kiQk2_93= zg=Z=p74|OMq&1p&+Q=MU$YN%;`t&MC1}^?%Yb|8YRcj$f(*bE_vK{6Ddn88&gDS}! zaP&JKNg@7G$fb5^dl9k6+ud)6Y|whi^Drc8S5F;(t2_TmtR2$hf1VCiHVBCP4)Bf36>-55axaYtCq z0w$&*9EnV)Ei(IFAmp50dP%_mV*djazm(t=j6u*a=iR;uG_(<&{9RBUHTpyk4R9DHK#Eh~|#ZZyEmA@$+ivcm9GnC%cOJ>+~ z?m5~Ffd)+%m0#sH(j-&BWL3+mhrKvW`(vSSn64n#;Dk$EU^9&SeF1+GqTuW&epnH| zfQPh09g*JT=FBkzaF!G$XxM@y<&3V_{rKsiR!SBa1#q#9j9C=$sSRR7gx`*i>(w#w zslyo{Lfsv>{}VS4H?jexX3D3zL{MOc-OA~zgoYHJI-p#jgz=9SkmQLjt|fbW%Aeh& zfWp)~$&QGWEGFF&>Hj;HLJ?}dVM=sZ*oe*e9NZk&BwsvEOg<2TQz&dc56&OkmJT&x>NXL39 z920&3nD8SFK_v`m(EyV6V?m9}ebI>pRBNwq3;AZt+M5HtaaVCd|o09ohF^FkC*p~^6 zuMYa^zEq%!ftrJT&(a9P(Tq63k1c~#L$=_eoe-8_km1NPCe7U28##iutf*hM3S$$f zl}m4RxIq@(vXyixt|FrP;+PWFD)baPO_1X_E;Gf2P^_gvuh@Mo0$c>-%LJUgI0d=> zaJ^T$7X&5S34sG7>6!{UW$?JzwWXDbT>3Vu4f00VoDgxI2`C0mT+oQa$T$&_up}!d zF4xk1NNgaIcvRYm0{SYGv%&Rcvl8~bMAPNy2{H+&BcTem+L zgCW*A16I zc$3KW8YgV;X};o4S38}{2$(nNIJzEfSd8aBq2iu8j6}yRdFPt}A zJzO->FjhF`yu2-%zj<)$HFrfcxAMBlvTzSXPL>?FxRR*w1Bb1&5KPzn1@yLHa1TUK znR$=zKC^px$;2%U@07jk+=U{B?~J+1M~;uR#;R_gs;C)C9Xg59rsgfcaoBnD&usa5 zrkihB!GT)pMwMS=qrPH&By`srkkK zl98I31rZudM?53#FBV5L>jy2K5xpEGw5I(WCF_w29L9hNARL&zBQRX*l^|&xZ&dhzPDgPQ;78=&G^?B}?cLp)4@1=W5 zYl#j&prm5-fSOFAp}YkK+5e4({ul7UeAw}fIJ&9zp1qr!o3}T$vbX)<*nf<8I*wgh zO-abqG&$W*t{z@Hkx@0e>9s|Z%QwaFSG#G-T}U@xlus;3x2Iem6d5w!+I8m9$$EQHdUDC`drc)69dg zUs$y}M5gldGL1nzII>PPexf7m)ErhBr_+Qr+F9qCAyzxTH%AtQup3QCSeEn%>~IlX z4dl8|{D^w;fzd%vYVFqR56pz&*&N45(F#eAQWjZn8pmbEV7U2YKjlT1TS<>5B+^4n zJE{)HVJT?*u+Hqxq{T2Y(^Avy*0m?)x7!|Vhq+M=jC&cam0L4MYg3hQ>F6A-CB&Qb zsA=xdwKnay+}bjw(9Uw@P5X^hD({_S#hUc!Tg`B?y{}n#xS?zZ?}%_5LtePSpD=gI3n;=Ok$ML9l1~vF>#oU;q_zfe5xu8%tFr!#VgmJM}HWK@ir zUv*w|;&9xx6MOHD-gZx{`W_y)=!K%u#urM)-Akg*CDSaU{Kbi+*p#by#QakF3+bTTrwR&(>{D(Jos2t-8`n&?xv`-iDyc*+@&335By-!Nce${Qj%R_w&%H6~+<48EJ!t3r0AQ&;cD!NvHqG3C^NIXG(Z_2y z_!-ZF<&tLkYzr2CnlzVeiv9){n^+~BvxQ~PW^_oBvVg)4Ipy(G*$x>R5@v_YbV)k$ zLA5c5rLWs&YO@Zc4y347YIr|^9W#MJPzU?i8FQSx1=%ED)C4kfmRTB;FfvLPiULM_ zvP+jCib2$5@iG@aKyLziO~6U?=?aYqArE+Q0m89%s48$U1@tN)gz3x=9)po%0cRXTYV^JC(ls@5vCKGpK6`&AvmwyqxB zG0dz{!VM(ftg6v*1g&5l6hRG>d_d}f(=6EK7`2?itCh|FYN=>NphTJ(GHe62&#$0S ziw;2V!zpJDNxjyop4}17grsx=hb}op-mIcb;;H5(+twi?`IKCJ&B0P^<{Sw2Zqn@w z5a)1SL~Rg2FS8@Eev7e7BvO>G<4{Y|RfS7|h`&jakWo*nEkjWdS?Q7ij2itf3-Wc< z-L(00jr%rx>+0BmJtRW>-2r%lQ{uO{KwM5Egx!yZcN8TvWta**kZm2;GFLjcH`GIg zdfNjyjHV+%T02-D;<^JbE;Q)k7ngu@7u)a(iQLhedUn;g+U78rZ=6R1SsmneD3IUH z1|cFYqNa-_FuCL#W_0bS^KNG?C&8gQa!_~FgCvVY4FPm8EFU0Jb-HSmZk(eq(vcA6(%=lr!~t0THZDQ z0JWzgI8xE98ff=iK)V{kOEqR13K;^dRYn7X3P}bJ&H4oR5F8Zfa1}1A8_AiO#i(2e zjQ|~d$?(6ryCMHzdiA)&cHp238^HD~F=&qubrH(8Qa$X_I zBZwDBSs*)B#Vl;?hN)6DE|nTSGM4s^?S|Fj$vV>vTP#n}Bv~<4kGjWBzEd#azGJZY z=Na?ZHo~c;E5Dom?eybk?QJ73| zLbHKMMXDm&`oS;>TQihGAz2H{NS`HT7z}G>SI1FWF>q;pH?4W>mN=ffHaj(QZ(37P z0V-2jvl9a;gh}1IxC#?U9xFI$x`Kz*sevhk=}DDlh>}fqB};7}w-HsPJVbHP_so~! zBpw;5x29Iv(fK$%RZpeK`Se?uWy~B`#)DTQYK}eZAWE=L5H6^UGc02uPVg&(M>)6$ zn&|2HV`FX3Qg?@4;MVW8j|csUxs%9$z)(&iKw*;DMk z!X$rH+EaAkg+8ks^wP0Yr8!vidR+E+RE#G0w4iij$a7rKB zC}+_~R05F^=#{P^VRj2Y{GLk20bYND9|k-r1wQa#KzbX#aXZ}lh)?R9 zmkb{DR?q)U@S*)g0FOI===c+BN6M}OJvb|-3QC3p=XwXXO}ooSZX0c#tXm(eTR-kr z&q_|0TZ(2b9$wjjascZkU5(>KEo-o@Soc%4yJwo>S$8d$Ufq3Fq z)JGoFiHj$^&7*ffT@!ezAm(lUHDmm5nh#)6A`TgLTissmg<}0l~^1taHUvX!2`CTx9rek?~&-J1vW0jN3 zn_|nGCcMq#1&)LcDooaIh~aPk#_LwgqAchGJ>+C&eGFcCl7mGBnGy2-G>2pZy&Fit zk7CmpKf&DyY{my_lav_q$Rj_NgRB{uCtzul(J(W{OYQ3Y*~&1oO5?~+YxJzC^)5BmU{&G=yW1cH z2-9vnYHq=>=lRm7OGhgw7q5*iUK=f3H|}nTIvZGHaCEoP5p}faaS<5JVJR1j0Y5^Y z$~8X9mgp|lU)KoM=t(-t_5(|*!+9es#ZmKNmesKlr@dPo+sz-^t&Xe@(^DL4f0bo+ ztY;NrN!yT0eP~IdXNH3|`K%mH5Q?crcjVB;Yl>_IBqBuqxO5F$|Jig5kWjNxz}+AIk*OA_1q~(erv@0>S%%Xv&W12{!?tp7$GP6g{nG7j4%4{<`LzQXGs6Am^ z%*{AqX2Zr(6N`>25k1R1)kZQlkE~$SnrVqZ(6VCGpjHr*Ns2o(OPy<~*&Va{=>Y#o z6|bfu6g!cQpqd#Gn0&(;UC7E!ZJ-z>Z&;JS0G4Q5Me@LTvZFYmlY~j=mL9U~os}Ek zBP3_0>$YZY$E34d1?v|97Ywj)tt;BWG_?oS)*R&QKf7!ZeF4E37)7-{8u079Eg~#z z1sxoi5TT2Bb_{}KHLY5}z1kaOQ}_U50eATU_Os#u8H~;mMUIic$+8QVXbUKVTQYM) z<40$eiRRAY6V#qb;uq#_KohU_f$CMvy0rzH0fKhDJR2d5cSIiS`Y1Syj#vV`3HEdhx7xtfrHaSpp+`H)aNdHg^2-UK?X>pT;z zLKT+6zVAyBJ3uVl#GMpDf)p1K+@O_a01yiWiUQU1=w-ySJ6eUi&Cr{$V ztM~4^`~B~~|6mZB``u9nD>p8qaXs<{s*RXU^YQ9MEjN%LEK2v+8GVO&{A!pbTj${2pgU_NtV-Y#O*+7ykM1J;$fD!yf4Nc4-LeShs2Qa z%_swv#~Dw@JOf2N-Z8IbqY%wcm63bY6g|V4H|Ibuyp8Q~6`D1S#oFu^5M$CtVj;#+ z1=>FHh&iOE$v$8-RmO(Jw8-WVJ^|qVh2AbKJqN@AAXNaB@RS?}lUH2VB=XOZN~>%f zNh}_=yf&cB&DJE89-L&oh#n{*mymm6VT208C3OkKK&7rg&bX} zvO`o-x-N8p^#=P^64GK4s!6DF7NvHCkcl)77FHwu4^izG_->KeW-PIYmyJYV#!&`D zWWd+@-sqjnYWSvS=D@#By3zIfY0x_ZcDtr|$rY2gj>>QApmA2+^wuy!og?ap5aLrA zuhz|`RR(K!h0=C`0H1QdT5u)qPVUYL&mzh3wV{Hw(+6hOUq3Vxm@U`=$~=!mdCSz^ z$tP#?Y873&d3x(?)}~_nh16y z-6r1ix_vN?jdLZY&-)5OzJm8+l6?;>!CP_RUAZd;YN#+%Hx|uaXsSMhqZH2I1)Z;p zA|xj?;J#e?Yb5rGh^o3{^T!0`3v@wU$ZHZY(Fhg`(nM3tu|gU2nLA%g#xgL~ZH#(I z;5h0c-5qg357A~>6-`m+ld#X9oQPwR)|mH*J6dBG4H9x8umRWyfJF z*;wmJd5ne&iXgd-Co6rSuRqDF-+w?>;0Yflx6-i$0!So5K9DCX6|OK4&I$#Z?Pt#D zT>zSM0m#WppB--k<{FUVkDGbgK=-|fWv2*i*|neJ&tF0U*MFEHppqT-ou`#@&r_LA zOJw5a?r-Paf5x3%r&A6PChdd)Pv8d9hElq=Kl@rUlndaV5Ek52SUCII=J}%LP*L;T z`u%ecJ-%2}`&Kh}Iz>AW{406qova*&Bn!f4VN%MMa<7(NDGeo+K~!;d_m$m%@*v!! zLuCO5#A`kf7!*dQ$A#Hrf&+9wzsT%~02(GL63u_H1u8({>nDQNVWAxnL2TWZ-~uxm zDgtJBmeB^w3!-HR88u=FvBZcAfTa|Oi+u(`uh<^zmxC3fiA!a=dWdvitVc*mmKb`h8 z<|hJBm~VymY6l~i4kx)WxtW#Dw6#BLB?~J1;Bo})8s(f}djT5Q1SvwjHClaUh2jh# ze)=?8(r$wjwS0hrtnaidnD_(g80QLYlQ6i5fonkrH+MS40X7vWKY#uN`L&x&WXnIz ze0!N3#j}Nk{TD7kx352-{W*RDm!aC-o zD@TJ_o2K@@dF zpMIn0&9ZA{^J}(+@PFDi1m{@u?Y=)g7~0*AP`Q))raV)blLx=}>8Zfc zo)2+**hHNhc!p-Xia;=7HV6eMy$qfk5Ykw9Aqb&@&85=@B1;rwIYJO`L`}i4d#?`}cqj2g9kE2 z)PM@);g^^aq~%X;nye1`9|-1eo=x2nOxPlm*;Vx~v$4W#n5#q0igp%5*^PhZg^`nM ziP){(?<&}=o=Y*%cgScPY*m)IWJMeW3(g@y=FuwqW~&rnVc|VEV&F%CVoL&}hzr5S zY;oB^K8+-Sxhcy8NbpDrRb}A4Y#2`2Ams0VMt3u$wg=XY5L06))Cj))Q`|4ain)iA z1(Jv^j+89x1n5+#pRtyXj<0c*RiOY-sF_9K%#z8T$;X3Ldv9+1!=2yX8Qgm^n0{&* zh2@Q8wzHy08mgACmC1EhK_TUfuB8~SP8P|V=+i+o&ORL~s?Ku732}m(;^-ZW2th*- zG3U^co-kkIU>-Pkp?7F-K*i8;NHRH#GLu{+b_i&2-=jxi{kpz{o_7bJL2b$2qKRZJ zgy$4uA-2hKtn)&`c46==)D@KTEFZ`5O|(IK3U_vFln+O8%-(Q48XT?vmE*ex?F<@^^vter4JNlP$20Mj>Nw8;#0>&D);3b4aNY)5umZnPIVoDC9-gI|&;k*agY|{qB2lZr}PPBr2$)WOf{^ z_*ji@EpA?N!+XBF&)wsGF##$cc%rV$5XpAv3(3V8obah{yyIUMLbQ2_BsTR_F57}q z4_i)UWJN*YKVH{7mDQswe}qx~NGW%HhyKN_0z&2JrNGl%%t9jfTZb4#Yb52>an`9AX36$Swe5KQ1J=V1p`Jf2+4aKV zId5UOr1FKsx4nhSSBJSXX=)UASnJ-pJL#D(915ou z{o+BH7|G%2384nBB?@WnFuNC#(0aXy^MRl@PsTFX4ecncR`V=fD2#kUZ6w&2L-She z!yq~K60723SZb20tix7pwb1m)%b-*ZS#*rh0t zFA-1`g*;+n_HtsF{0U1ZE&QSj@zG-Uxu-WmVFZ6?Hi654ziNh<70ksHWOPiF!3BsS zgpMAwh;f*E5VRWsTRc79*XVmbhFXd}ahOmau%iU2WF(c73MF@~Um`N_MWX4srubj(He12Kf9R80FzKKnk8Y6D$jNid=*hK;(x`hf3u z_a3_}yrnmNx2v7cKgzVoT+MIiJ3lp|}=z+1Fw0 z2b;(H%RWnr0vv%eBiCi0@vYl6?!&PV`(gro(kGx4v;50GsF6VK(t#^+b@I>^2feo< zZV3WjDFwi-$N(%p7IYkJr@n^fz!#_j^*Wxcj>mhuWR&qWSEaP&*wLU@*C#!H-z#x%xsy>-|^kR%}w9A zbSwYho$UO{$L34cg-X^1i|Iacq7`~#6G^g_vB4~Bbgmk0C+1-xlW@nrkDz%aV4bJZ zLOwjeDxRmKFF2+XZEjN|))9B7#>K?Y_JF^zoPe#3c9M@zAPJCBN?Ka3JxW4C+-W2& zVu;@5DEy`x1xT{e^S<;PyfmgYzgy^kz3J7a>1@cjiVnJGlHQZQHy;RZ-1+v=@YVzO zV)^_^JoL1S))-mcMW-bz|LR%qfvbAjJrV!otTopz{oc{V!pdOP(hzz|upLm((= zVieRBP52eZHRZ1vscq7SLo}+n^~eW-&#PyL2ph>CRJ4g!&!LUP@I?+*V2x;m6wD0} zuCoImw}vS3@u|bXrbmOtkIiO29!!2*It1#F2j@yMu+O0r0=BjNY{6On;`HJpucl(~uPa^r8e0Ik< zWPp+-Ki=38hUG*agQG&R@Q^|Oj%-x;k0^d9o{r)+>4qD+99jo?(A)*Qi$dzL1v1S% z5|vklRbr(wRMX(ImmucNvRVR&pdO~7j3q*Ak~T&>A_q8KwKkv}&*S3-FHD&R?KlTj zzI%FmpVh0*b5w1;$VBzp8O|gnm#boaw8YaonM5EMPx2X)B(5)#7@Xx6i9JawC!h39 zzEmLDqR(bIzKfhqa8VrA4ifB^3!>`;Mul`b+1Y~5cKMIfof5f<%WeA}5=-gjS^UQv z{7NXKYnB=K7)gJ#ycX19;}klc>vaW`Sx*<(lDgd=wkn*WV4;D7fSA+fM>gJ~su?Rm z#VdmP7g&AAEgqssCj~Iz`7^y;;Db_rXn2zVgw+OlEK^7TIMIVPkX2|p{Ng9VPaQP* zSSsk3;%-<>Py;SImL29(Epo-$5}F8))TIXph8q(%CITRXi%_HDgMAGOoiLJX_FV?j zFc(+j^yNs}(A16>v3yh8f$Omml(UdP!m2QjQj!Ej z@8mRi7dI~@*v|utEUgU*tO1^bfa<9ay(s@beVuILO6^_Ats;pK$U*vknW z=2w=3h06&DrxhC}>lJW4Uf-*p+`f?x+G3(d*C>|(Dj>cTOcU?3!|1RC=vCD5h@jV$@EgS zfbIQ$Zu{V%zYmd}aH7Ga!f>Hsvz1KJ+BnU}n1~uJxhfhtCrZxvIrIo&dEkEUS)%B$ z41}%Ti+CvN5ZVuL2P3EB%>Ok${SouK`xktYofxjjeu$;&%$9sr5?@7dTsE4AM--lm zS)TKwvjjd1s1%GBxP4TPW8nNTyYTA6S00`!n9W{0;f8~l*F2N0U-td#?y3Iy>K&o# z9dp&Y!bRIA+k-{hrnb#jYzgSkE?EybYtjBUhNs(S)?9z=tDnY?8{QiyZf1P@ksFWRNDdY4cd&!vZR{Yf zdF>R(++_V|?f6;eTbav429H2D?K$2JBN2~soEctrzD~xni8#(-9#zBa;OrEa&lfj@ ziW{ceZ{&ox>(Z0MABy4Ba28Z!-J& zF<3T5W+7O$5low54qG1DCaTK@)8_GD@e{L|PX?2plpbl1qcLF6MHAa_`>8|oLvUlA*m+;jDqAIAJUYbM5L)bNl4Rrl98rE za+D(d@2bH;EF-=AG`GYL7X2N~(f@HM{+N>mckMMcTb~aq8n#Ez)0XC0tshEH{qWX9 za-JFnXQ9{K2mb@$Iw%U=B-n-gHz{@Tv~o$b{zRP!>;)7d4u@FGvxY-yA@Id%r(OM* zrd`5C#AjXLanZrD@eH0w@HuR?G6_lRpKgZ1C)5UC>;k1WT5F-9T zA4`0IL7kaid{ir?m`Eik6xi9hZ*TzWjc_8jIGz@kTRvB>c2*<{khFF4~8 zz(0ksU%-Jmr zQN3_w9cnCuCVUlH5L+V=-fQbg5hLh?aAO+$_4SI_;uCcz?P_1v6gEe%u8AXF+gJ0c zJ|6CH*V@rBh7gZ%QG$ih+v6N2e#cAsR`U0$23Qq4#?+QkT5ACTyxC(LPJ921k%oa% zEy5V|T^Q_w_A9*4%bj#b?v{0lql-bLVbj3yGiT`{cW4lrw%B9Q#!&CU^ZvE|OIE`^ z7}^-?Tg<7t2bI)xNW67nE1Nx`?XTA5cnh(gX^e%Phv~mSO=GhR`s{LiW)>E?2>=No zu~_DVT|k(?1!zvfjXSyyCaE4CGXTR^ILz&~ysEMCOSJBgumxxiVpAZTgWq)5zkY-4 zE!|UpB(ruEaL=_PeYLo$ESXO0ZJb&xg5&0rqYAR!E1LdN1lHi;;%%hS1-~`NPGxaA zkJgKD45>YzIlOIy(C8EWSb?k-z$YqfYK)tQnIocv(h~CrAQ2G3u30FwX`k(lN zLQCXwa94;P35rDJ0Xy|-S4h+2QYpKLNahLg`jJ#wvZv5efdRiu41*#b8n*eTvS+iZ zgUPz83+O`g`bf2tnXrs?LrL>Ux>dV^H@|PMzkF)bY*uYBxmIyC4`_oxs7#`jIHDK- zWDr`>I1B=Qsw*0a3Xh4db9N6s)F?uU>axkMJzv+miubHRF57#P)Wv(YBJzE#?Rx{; zf54a9?7wEeajRwFfYOP-wDmB{8P7!!L-k zg{TpvHv?n4fQY90))d_%o7Pr>l3IKREn1O}qwPYa5<1P;8A^67oXSjVNf|uK|BZ|4 z6_kiYot!SQ1}dkrr{d<4Ye3SCx4v?8aZS}!|5wY#TM=q+v8rymakgqJf0Qp)*H7=B zt=`Tb74M{FFRrPXU$Zf^X5-BM;Et2CYfepge=YUSnyLx!mr@s#3+9u{L&;dS(|L2r z>p@TDm42}wAu`htQ?c
W=>kUtITW9d!Hi5@ORSg{^;r%cndq2 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 + - Parse a date, get a `datetime.date `_ + - Parse a datetime, get a `datetime.datetime `_ + - Parse a duration, get a `datetime.timedelta `_ + - Parse an interval, get a tuple of dates or datetimes + - Parse a repeating interval, get a date or datetime `generator `_ + +* UTC offset represented as fixed-offset tzinfo +* Parser separate from representation, allowing parsing to different datetime representations (see `Builders`_) +* No regular expressions + +Installation +============ + +The recommended installation method is to use pip:: + + $ pip install aniso8601 + +Alternatively, you can download the source (git repository hosted at `Bitbucket `_) and install directly:: + + $ python setup.py install + +Use +=== + +Parsing datetimes +----------------- + +*Consider* `datetime.datetime.fromisoformat `_ *for basic ISO 8601 datetime parsing* + +To parse a typical ISO 8601 datetime string:: + + >>> import aniso8601 + >>> aniso8601.parse_datetime('1977-06-10T12:00:00Z') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +Alternative delimiters can be specified, for example, a space:: + + >>> aniso8601.parse_datetime('1977-06-10 12:00:00Z', delimiter=' ') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +UTC offsets are supported:: + + >>> aniso8601.parse_datetime('1979-06-05T08:00:00-08:00') + datetime.datetime(1979, 6, 5, 8, 0, tzinfo=-8:00:00 UTC) + +If a UTC offset is not specified, the returned datetime will be naive:: + + >>> aniso8601.parse_datetime('1983-01-22T08:00:00') + datetime.datetime(1983, 1, 22, 8, 0) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_datetime('2018-03-06T23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/time.py", line 196, in parse_datetime + return builder.build_datetime(datepart, timepart) + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/builders/python.py", line 237, in build_datetime + cls._build_object(time)) + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/builders/__init__.py", line 336, in _build_object + return cls.build_time(hh=parsetuple.hh, mm=parsetuple.mm, + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/builders/python.py", line 191, in build_time + hh, mm, ss, tz = cls.range_check_time(hh, mm, ss, tz) + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/builders/__init__.py", line 266, in range_check_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +To get the resolution of an ISO 8601 datetime string:: + + >>> aniso8601.get_datetime_resolution('1977-06-10T12:00:00Z') == aniso8601.resolution.TimeResolution.Seconds + True + >>> aniso8601.get_datetime_resolution('1977-06-10T12:00') == aniso8601.resolution.TimeResolution.Minutes + True + >>> aniso8601.get_datetime_resolution('1977-06-10T12') == aniso8601.resolution.TimeResolution.Hours + True + +Note that datetime resolutions map to :code:`TimeResolution` as a valid datetime must have at least one time member so the resolution mapping is equivalent. + +Parsing dates +------------- + +*Consider* `datetime.date.fromisoformat `_ *for basic ISO 8601 date parsing* + +To parse a date represented in an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_date('1984-04-23') + datetime.date(1984, 4, 23) + +Basic format is supported as well:: + + >>> aniso8601.parse_date('19840423') + datetime.date(1984, 4, 23) + +To parse a date using the ISO 8601 week date format:: + + >>> aniso8601.parse_date('1986-W38-1') + datetime.date(1986, 9, 15) + +To parse an ISO 8601 ordinal date:: + + >>> aniso8601.parse_date('1988-132') + datetime.date(1988, 5, 11) + +To get the resolution of an ISO 8601 date string:: + + >>> aniso8601.get_date_resolution('1981-04-05') == aniso8601.resolution.DateResolution.Day + True + >>> aniso8601.get_date_resolution('1981-04') == aniso8601.resolution.DateResolution.Month + True + >>> aniso8601.get_date_resolution('1981') == aniso8601.resolution.DateResolution.Year + True + +Parsing times +------------- + +*Consider* `datetime.time.fromisoformat `_ *for basic ISO 8601 time parsing* + +To parse a time formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_time('11:31:14') + datetime.time(11, 31, 14) + +As with all of the above, basic format is supported:: + + >>> aniso8601.parse_time('113114') + datetime.time(11, 31, 14) + +A UTC offset can be specified for times:: + + >>> aniso8601.parse_time('17:18:19-02:30') + datetime.time(17, 18, 19, tzinfo=-2:30:00 UTC) + >>> aniso8601.parse_time('171819Z') + datetime.time(17, 18, 19, tzinfo=+0:00:00 UTC) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_time('21:42') + datetime.time(21, 42) + >>> aniso8601.parse_time('22') + datetime.time(22, 0) + +A decimal fraction is always allowed on the lowest order element of an ISO 8601 formatted time:: + + >>> aniso8601.parse_time('22:33.5') + datetime.time(22, 33, 30) + >>> aniso8601.parse_time('23.75') + datetime.time(23, 45) + +The decimal fraction can be specified with a comma instead of a full-stop:: + + >>> aniso8601.parse_time('22:33,5') + datetime.time(22, 33, 30) + >>> aniso8601.parse_time('23,75') + datetime.time(23, 45) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_time('23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/time.py", line 174, in parse_time + return builder.build_time(hh=hourstr, mm=minutestr, ss=secondstr, tz=tz) + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/builders/python.py", line 191, in build_time + hh, mm, ss, tz = cls.range_check_time(hh, mm, ss, tz) + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/builders/__init__.py", line 266, in range_check_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +To get the resolution of an ISO 8601 time string:: + + >>> aniso8601.get_time_resolution('11:31:14') == aniso8601.resolution.TimeResolution.Seconds + True + >>> aniso8601.get_time_resolution('11:31') == aniso8601.resolution.TimeResolution.Minutes + True + >>> aniso8601.get_time_resolution('11') == aniso8601.resolution.TimeResolution.Hours + True + +Parsing durations +----------------- + +To parse a duration formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_duration('P1Y2M3DT4H54M6S') + datetime.timedelta(428, 17646) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_duration('P1Y') + datetime.timedelta(365) + +A decimal fraction is allowed on the lowest order element:: + + >>> aniso8601.parse_duration('P1YT3.5M') + datetime.timedelta(365, 210) + +The decimal fraction can be specified with a comma instead of a full-stop:: + + >>> aniso8601.parse_duration('P1YT3,5M') + datetime.timedelta(365, 210) + +Parsing a duration from a combined date and time is supported as well:: + + >>> aniso8601.parse_duration('P0001-01-02T01:30:05') + datetime.timedelta(397, 5405) + +To get the resolution of an ISO 8601 duration string:: + + >>> aniso8601.get_duration_resolution('P1Y2M3DT4H54M6S') == aniso8601.resolution.DurationResolution.Seconds + True + >>> aniso8601.get_duration_resolution('P1Y2M3DT4H54M') == aniso8601.resolution.DurationResolution.Minutes + True + >>> aniso8601.get_duration_resolution('P1Y2M3DT4H') == aniso8601.resolution.DurationResolution.Hours + True + >>> aniso8601.get_duration_resolution('P1Y2M3D') == aniso8601.resolution.DurationResolution.Days + True + >>> aniso8601.get_duration_resolution('P1Y2M') == aniso8601.resolution.DurationResolution.Months + True + >>> aniso8601.get_duration_resolution('P1Y') == aniso8601.resolution.DurationResolution.Years + True + +The default :code:`PythonTimeBuilder` assumes years are 365 days, and months are 30 days. Where calendar level accuracy is required, a `RelativeTimeBuilder `_ can be used, see also `Builders`_. + +Parsing intervals +----------------- + +To parse an interval specified by a start and end:: + + >>> import aniso8601 + >>> aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00') + (datetime.datetime(2007, 3, 1, 13, 0), datetime.datetime(2008, 5, 11, 15, 30)) + +Intervals specified by a start time and a duration are supported:: + + >>> aniso8601.parse_interval('2007-03-01T13:00:00Z/P1Y2M10DT2H30M') + (datetime.datetime(2007, 3, 1, 13, 0, tzinfo=+0:00:00 UTC), datetime.datetime(2008, 5, 9, 15, 30, tzinfo=+0:00:00 UTC)) + +A duration can also be specified by a duration and end time:: + + >>> aniso8601.parse_interval('P1M/1981-04-05') + (datetime.date(1981, 4, 5), datetime.date(1981, 3, 6)) + +Notice that the result of the above parse is not in order from earliest to latest. If sorted intervals are required, simply use the :code:`sorted` keyword as shown below:: + + >>> sorted(aniso8601.parse_interval('P1M/1981-04-05')) + [datetime.date(1981, 3, 6), datetime.date(1981, 4, 5)] + +The end of an interval is returned as a datetime when required to maintain the resolution specified by a duration, even if the duration start is given as a date:: + + >>> aniso8601.parse_interval('2014-11-12/PT4H54M6.5S') + (datetime.date(2014, 11, 12), datetime.datetime(2014, 11, 12, 4, 54, 6, 500000)) + >>> aniso8601.parse_interval('2007-03-01/P1.5D') + (datetime.date(2007, 3, 1), datetime.datetime(2007, 3, 2, 12, 0)) + +Concise representations are supported:: + + >>> aniso8601.parse_interval('2020-01-01/02') + (datetime.date(2020, 1, 1), datetime.date(2020, 1, 2)) + >>> aniso8601.parse_interval('2007-12-14T13:30/15:30') + (datetime.datetime(2007, 12, 14, 13, 30), datetime.datetime(2007, 12, 14, 15, 30)) + >>> aniso8601.parse_interval('2008-02-15/03-14') + (datetime.date(2008, 2, 15), datetime.date(2008, 3, 14)) + >>> aniso8601.parse_interval('2007-11-13T09:00/15T17:00') + (datetime.datetime(2007, 11, 13, 9, 0), datetime.datetime(2007, 11, 15, 17, 0)) + +Repeating intervals are supported as well, and return a `generator `_:: + + >>> aniso8601.parse_repeating_interval('R3/1981-04-05/P1D') + + >>> list(aniso8601.parse_repeating_interval('R3/1981-04-05/P1D')) + [datetime.date(1981, 4, 5), datetime.date(1981, 4, 6), datetime.date(1981, 4, 7)] + +Repeating intervals are allowed to go in the reverse direction:: + + >>> list(aniso8601.parse_repeating_interval('R2/PT1H2M/1980-03-05T01:01:00')) + [datetime.datetime(1980, 3, 5, 1, 1), datetime.datetime(1980, 3, 4, 23, 59)] + +Unbounded intervals are also allowed (Python 2):: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> result.next() + datetime.datetime(1980, 3, 5, 1, 1) + >>> result.next() + datetime.datetime(1980, 3, 4, 23, 59) + +or for Python 3:: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> next(result) + datetime.datetime(1980, 3, 5, 1, 1) + >>> next(result) + datetime.datetime(1980, 3, 4, 23, 59) + +Note that you should never try to convert a generator produced by an unbounded interval to a list:: + + >>> list(aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00')) + Traceback (most recent call last): + File "", line 1, in + File "/home/nielsenb/Jetfuse/aniso8601/aniso8601/aniso8601/builders/python.py", line 560, in _date_generator_unbounded + currentdate += timedelta + OverflowError: date value out of range + +To get the resolution of an ISO 8601 interval string:: + + >>> aniso8601.get_interval_resolution('2007-03-01T13:00:00/2008-05-11T15:30:00') == aniso8601.resolution.IntervalResolution.Seconds + True + >>> aniso8601.get_interval_resolution('2007-03-01T13:00/2008-05-11T15:30') == aniso8601.resolution.IntervalResolution.Minutes + True + >>> aniso8601.get_interval_resolution('2007-03-01T13/2008-05-11T15') == aniso8601.resolution.IntervalResolution.Hours + True + >>> aniso8601.get_interval_resolution('2007-03-01/2008-05-11') == aniso8601.resolution.IntervalResolution.Day + True + >>> aniso8601.get_interval_resolution('2007-03/P1Y') == aniso8601.resolution.IntervalResolution.Month + True + >>> aniso8601.get_interval_resolution('2007/P1Y') == aniso8601.resolution.IntervalResolution.Year + True + +And for repeating ISO 8601 interval strings:: + + >>> aniso8601.get_repeating_interval_resolution('R3/1981-04-05/P1D') == aniso8601.resolution.IntervalResolution.Day + True + >>> aniso8601.get_repeating_interval_resolution('R/PT1H2M/1980-03-05T01:01:00') == aniso8601.resolution.IntervalResolution.Seconds + True + +Builders +======== + +Builders can be used to change the output format of a parse operation. All parse functions have a :code:`builder` keyword argument which accepts a builder class. + +Two builders are included. The :code:`PythonTimeBuilder` (the default) in the :code:`aniso8601.builders.python` module, and the :code:`TupleBuilder` which returns the parse result as a corresponding named tuple and is located in the :code:`aniso8601.builders` module. + +Information on writing a builder can be found in `BUILDERS `_. + +The following builders are available as separate projects: + +* `RelativeTimeBuilder `_ supports parsing to `datetutil relativedelta types `_ for calendar level accuracy +* `AttoTimeBuilder `_ supports parsing directly to `attotime attodatetime and attotimedelta types `_ which support sub-nanosecond precision +* `NumPyTimeBuilder `_ supports parsing directly to `NumPy datetime64 and timedelta64 types `_ + +TupleBuilder +------------ + +The :code:`TupleBuilder` returns parse results as `named tuples `_. It is located in the :code:`aniso8601.builders` module. + +Datetimes +^^^^^^^^^ + +Parsing a datetime returns a :code:`DatetimeTuple` containing :code:`Date` and :code:`Time` tuples . The date tuple contains the following parse components: :code:`YYYY`, :code:`MM`, :code:`DD`, :code:`Www`, :code:`D`, :code:`DDD`. The time tuple contains the following parse components :code:`hh`, :code:`mm`, :code:`ss`, :code:`tz`, where :code:`tz` itself is a tuple with the following components :code:`negative`, :code:`Z`, :code:`hh`, :code:`mm`, :code:`name` with :code:`negative` and :code:`Z` being booleans:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_datetime('1977-06-10T12:00:00', builder=TupleBuilder) + Datetime(date=Date(YYYY='1977', MM='06', DD='10', Www=None, D=None, DDD=None), time=Time(hh='12', mm='00', ss='00', tz=None)) + >>> aniso8601.parse_datetime('1979-06-05T08:00:00-08:00', builder=TupleBuilder) + Datetime(date=Date(YYYY='1979', MM='06', DD='05', Www=None, D=None, DDD=None), time=Time(hh='08', mm='00', ss='00', tz=Timezone(negative=True, Z=None, hh='08', mm='00', name='-08:00'))) + +Dates +^^^^^ + +Parsing a date returns a :code:`DateTuple` containing the following parse components: :code:`YYYY`, :code:`MM`, :code:`DD`, :code:`Www`, :code:`D`, :code:`DDD`:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_date('1984-04-23', builder=TupleBuilder) + Date(YYYY='1984', MM='04', DD='23', Www=None, D=None, DDD=None) + >>> aniso8601.parse_date('1986-W38-1', builder=TupleBuilder) + Date(YYYY='1986', MM=None, DD=None, Www='38', D='1', DDD=None) + >>> aniso8601.parse_date('1988-132', builder=TupleBuilder) + Date(YYYY='1988', MM=None, DD=None, Www=None, D=None, DDD='132') + +Times +^^^^^ + +Parsing a time returns a :code:`TimeTuple` containing following parse components: :code:`hh`, :code:`mm`, :code:`ss`, :code:`tz`, where :code:`tz` is a :code:`TimezoneTuple` with the following components :code:`negative`, :code:`Z`, :code:`hh`, :code:`mm`, :code:`name`, with :code:`negative` and :code:`Z` being booleans:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_time('11:31:14', builder=TupleBuilder) + Time(hh='11', mm='31', ss='14', tz=None) + >>> aniso8601.parse_time('171819Z', builder=TupleBuilder) + Time(hh='17', mm='18', ss='19', tz=Timezone(negative=False, Z=True, hh=None, mm=None, name='Z')) + >>> aniso8601.parse_time('17:18:19-02:30', builder=TupleBuilder) + Time(hh='17', mm='18', ss='19', tz=Timezone(negative=True, Z=None, hh='02', mm='30', name='-02:30')) + +Durations +^^^^^^^^^ + +Parsing a duration returns a :code:`DurationTuple` containing the following parse components: :code:`PnY`, :code:`PnM`, :code:`PnW`, :code:`PnD`, :code:`TnH`, :code:`TnM`, :code:`TnS`:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_duration('P1Y2M3DT4H54M6S', builder=TupleBuilder) + Duration(PnY='1', PnM='2', PnW=None, PnD='3', TnH='4', TnM='54', TnS='6') + >>> aniso8601.parse_duration('P7W', builder=TupleBuilder) + Duration(PnY=None, PnM=None, PnW='7', PnD=None, TnH=None, TnM=None, TnS=None) + +Intervals +^^^^^^^^^ + +Parsing an interval returns an :code:`IntervalTuple` containing the following parse components: :code:`start`, :code:`end`, :code:`duration`, :code:`start` and :code:`end` may both be datetime or date tuples, :code:`duration` is a duration tuple:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00', builder=TupleBuilder) + Interval(start=Datetime(date=Date(YYYY='2007', MM='03', DD='01', Www=None, D=None, DDD=None), time=Time(hh='13', mm='00', ss='00', tz=None)), end=Datetime(date=Date(YYYY='2008', MM='05', DD='11', Www=None, D=None, DDD=None), time=Time(hh='15', mm='30', ss='00', tz=None)), duration=None) + >>> aniso8601.parse_interval('2007-03-01T13:00:00Z/P1Y2M10DT2H30M', builder=TupleBuilder) + Interval(start=Datetime(date=Date(YYYY='2007', MM='03', DD='01', Www=None, D=None, DDD=None), time=Time(hh='13', mm='00', ss='00', tz=Timezone(negative=False, Z=True, hh=None, mm=None, name='Z'))), end=None, duration=Duration(PnY='1', PnM='2', PnW=None, PnD='10', TnH='2', TnM='30', TnS=None)) + >>> aniso8601.parse_interval('P1M/1981-04-05', builder=TupleBuilder) + Interval(start=None, end=Date(YYYY='1981', MM='04', DD='05', Www=None, D=None, DDD=None), duration=Duration(PnY=None, PnM='1', PnW=None, PnD=None, TnH=None, TnM=None, TnS=None)) + +A repeating interval returns a :code:`RepeatingIntervalTuple` containing the following parse components: :code:`R`, :code:`Rnn`, :code:`interval`, where :code:`R` is a boolean, :code:`True` for an unbounded interval, :code:`False` otherwise.:: + + >>> aniso8601.parse_repeating_interval('R3/1981-04-05/P1D', builder=TupleBuilder) + RepeatingInterval(R=False, Rnn='3', interval=Interval(start=Date(YYYY='1981', MM='04', DD='05', Www=None, D=None, DDD=None), end=None, duration=Duration(PnY=None, PnM=None, PnW=None, PnD='1', TnH=None, TnM=None, TnS=None))) + >>> aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00', builder=TupleBuilder) + RepeatingInterval(R=True, Rnn=None, interval=Interval(start=None, end=Datetime(date=Date(YYYY='1980', MM='03', DD='05', Www=None, D=None, DDD=None), time=Time(hh='01', mm='01', ss='00', tz=None)), duration=Duration(PnY=None, PnM=None, PnW=None, PnD=None, TnH='1', TnM='2', TnS=None))) + +Development +=========== + +Setup +----- + +It is recommended to develop using a `virtualenv `_. + +Inside a virtualenv, development dependencies can be installed automatically:: + + $ pip install -e .[dev] + +`pre-commit `_ is used for managing pre-commit hooks:: + + $ pre-commit install + +To run the pre-commit hooks manually:: + + $ pre-commit run --all-files + +Tests +----- + +Tests can be run using the `unittest testing framework `_:: + + $ python -m unittest discover aniso8601 + +Contributing +============ + +aniso8601 is an open source project hosted on `Bitbucket `_. + +Any and all bugs are welcome on our `issue tracker `_. +Of particular interest are valid ISO 8601 strings that don't parse, or invalid ones that do. At a minimum, +bug reports should include an example of the misbehaving string, as well as the expected result. Of course +patches containing unit tests (or fixed bugs) are welcome! + +References +========== + +* `ISO 8601:2004(E) `_ (Caution, PDF link) +* `Wikipedia article on ISO 8601 `_ +* `Discussion on alternative ISO 8601 parsers for Python `_ diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/RECORD new file mode 100644 index 00000000..f025c43e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/RECORD @@ -0,0 +1,61 @@ +aniso8601-10.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aniso8601-10.0.0.dist-info/LICENSE,sha256=w8yguadP0pZovZm13PAnTVO-kE3md4kW3IUnCPQHsPA,1501 +aniso8601-10.0.0.dist-info/METADATA,sha256=xdACJdmxmW0r6sVmuokYme51EH23UhNhbwOc1246CIg,23577 +aniso8601-10.0.0.dist-info/RECORD,, +aniso8601-10.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +aniso8601-10.0.0.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109 +aniso8601-10.0.0.dist-info/top_level.txt,sha256=MVQomyeED8nGIH7PUQdMzxgLppIB48oYHtcmL17ETB0,10 +aniso8601/__init__.py,sha256=LwoL2Wj0kdYdHS3YqvGPH6SJ1HQWpsN9jKsAMHlAdwE,705 +aniso8601/__pycache__/__init__.cpython-312.pyc,, +aniso8601/__pycache__/compat.cpython-312.pyc,, +aniso8601/__pycache__/date.cpython-312.pyc,, +aniso8601/__pycache__/decimalfraction.cpython-312.pyc,, +aniso8601/__pycache__/duration.cpython-312.pyc,, +aniso8601/__pycache__/exceptions.cpython-312.pyc,, +aniso8601/__pycache__/interval.cpython-312.pyc,, +aniso8601/__pycache__/resolution.cpython-312.pyc,, +aniso8601/__pycache__/time.cpython-312.pyc,, +aniso8601/__pycache__/timezone.cpython-312.pyc,, +aniso8601/__pycache__/utcoffset.cpython-312.pyc,, +aniso8601/builders/__init__.py,sha256=jXJ75D-QRhB8huW2GyShjh_I4Z83ua4Qgzn1DQiX-1M,17975 +aniso8601/builders/__pycache__/__init__.cpython-312.pyc,, +aniso8601/builders/__pycache__/python.cpython-312.pyc,, +aniso8601/builders/python.py,sha256=U0Tvqt4vPVcH9epfkbz_o4550yr_4_Q8SvoUdj9JAvs,22072 +aniso8601/builders/tests/__init__.py,sha256=qjC0jrTWf2UUlZtXE3AKcMFSLC2kQPOvAI36t5gc8q0,209 +aniso8601/builders/tests/__pycache__/__init__.cpython-312.pyc,, +aniso8601/builders/tests/__pycache__/test_init.cpython-312.pyc,, +aniso8601/builders/tests/__pycache__/test_python.cpython-312.pyc,, +aniso8601/builders/tests/test_init.py,sha256=pyES5pMJUWy16KK4MLsfzRmPRcQvj6_vxcM8yzeZxOc,29997 +aniso8601/builders/tests/test_python.py,sha256=dhkaGiE0ToMPBhUmhOAeM32aC2SDu6Rj6d4YniV2M7A,62032 +aniso8601/compat.py,sha256=CvNkC-tCr3hzv1i9VOzgiPaS2EUxCfxtfo8SkJ2Juyc,571 +aniso8601/date.py,sha256=D3Kffr6Ln_z0fNTP5KAQa0R0T00VdmZgIS_O-pVmxnI,4496 +aniso8601/decimalfraction.py,sha256=NBUies6Gp1NrVkSU_9MwJNu28OhUIeWXNpkTRcClGYA,333 +aniso8601/duration.py,sha256=XEMm8t3Vipw3YsCgXf17XA10dHmUCQuJo4-PX4z8U7I,9550 +aniso8601/exceptions.py,sha256=uCQIrrIpCJV-n3WDUuhB3wMdgmHuu1UqOXrE9ct3xPY,1313 +aniso8601/interval.py,sha256=ruz49D2BoyoyYggM2oLrz0HSB8CIPxdl4LZCvwq3kCg,10752 +aniso8601/resolution.py,sha256=RJGfir0k6IiR3L1ZCrPvjhsQliVT_ZOcaeKqJqH6JHM,684 +aniso8601/tests/__init__.py,sha256=qjC0jrTWf2UUlZtXE3AKcMFSLC2kQPOvAI36t5gc8q0,209 +aniso8601/tests/__pycache__/__init__.cpython-312.pyc,, +aniso8601/tests/__pycache__/compat.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_compat.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_date.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_decimalfraction.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_duration.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_init.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_interval.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_time.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_timezone.cpython-312.pyc,, +aniso8601/tests/__pycache__/test_utcoffset.cpython-312.pyc,, +aniso8601/tests/compat.py,sha256=J4Ocl6zpo7WmA_pItOc2KUH8xZU156L9fTbCBBFX9xY,346 +aniso8601/tests/test_compat.py,sha256=55qZ_Uu7XRQo8hXNDUjy-IB3WaTqATnVtMlAJP4TGr4,763 +aniso8601/tests/test_date.py,sha256=bJy2ve-iFmWlBCWDidfK2lB-7OBMjeATfK3SBFSet4U,9266 +aniso8601/tests/test_decimalfraction.py,sha256=bvPPSuWnS2XfD10wBUjg5nFFbI1kfBshR2Wkmfggu6I,578 +aniso8601/tests/test_duration.py,sha256=QRLpd_bdgEzHjcLkLMFMWnGF4bN_YxPDdtwACtBekc4,44952 +aniso8601/tests/test_init.py,sha256=1GF0Yms8adNM3Ax13w2ncSz6toHhK3pRkPYoNaRcPVk,1689 +aniso8601/tests/test_interval.py,sha256=GjeU8HrIT-klpselgsgMcF1KfuV7sDKLlyVU5S4XMCQ,60457 +aniso8601/tests/test_time.py,sha256=SS0jXkEl5bYFSe1qFPpjZ0GNXycgBMH16Uc885ujR7I,19147 +aniso8601/tests/test_timezone.py,sha256=EJk2cTsHddhe2Pqtzl250gKF8XoXynEAngNctk23b48,4649 +aniso8601/tests/test_utcoffset.py,sha256=wQ7ivBqax2KP340tlC0DBxM7DTK9SNy_Zq_13FqeaKM,1926 +aniso8601/time.py,sha256=CZRisJz6u7fBfMthZvNcUuVFSL_GCYi9WEjXsbrnDF8,5687 +aniso8601/timezone.py,sha256=xpukG_AuvyMNGs57y4bf40eHRcpe3b1fKC8x-H8Epo8,2124 +aniso8601/utcoffset.py,sha256=dm7-eFl6WQFPpDamcTVl46aEjmGObpWJdSZJ-QzblfU,2421 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/WHEEL new file mode 100644 index 00000000..eaea6f3b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.8.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/top_level.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/top_level.txt new file mode 100644 index 00000000..166ae78c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601-10.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +aniso8601 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__init__.py new file mode 100644 index 00000000..c85d218b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +from aniso8601.date import get_date_resolution, parse_date +from aniso8601.duration import get_duration_resolution, parse_duration +from aniso8601.interval import ( + get_interval_resolution, + get_repeating_interval_resolution, + parse_interval, + parse_repeating_interval, +) + +# Import the main parsing functions so they are readily available +from aniso8601.time import ( + get_datetime_resolution, + get_time_resolution, + parse_datetime, + parse_time, +) + +__version__ = "10.0.0" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..931f1ecf764924680367ae67b2e2fdbb71091a99 GIT binary patch literal 725 zcmZuuO>fjN5Vf<(ekWUs&~oL*9$0s&R8=ZMLaLA|R8AlvUyLEvHq=gnon2{r>#yK9 z@H05`4|3^&Q*V{_uu@OVqzPIIj`EV3_xxtY{uzdS0_)BG_56oN$S(|<1#z|3AK>$i z#3ZJg7|N;fxJNPebj$eMHvtc-xTV{s!#k$SyQar`rqBCT-q!;&WHz0d#6~>i z&>zrSd+_K*^xzNhA9!iZL0LRls)yVPd+W)WB}HlI*QUFIL zIE9WA#1FOE10Q_Uf;v#xJgrO!#`sV+I@P=mP*2g6z|^YSzO@7ObRSXspYPaX^I&ak zx_HR=6WH2XT4JHq9;itgKwMQOpWrPh!%OgSvdA`)7Z9A`;Qu-6XY1#Btb>Er96Pce zKVOWpOfoK&%RL%dQi&+j<;)9x>Yym2La#x+rZlTxIe9^zNh&0vO_$5YCgZ-_A}cFT zSIO%AF5S9WAzs+- zxN4!(kEWU2&>Juwh@2jHQHz|{Y5;#S*`LMo{@nZOs5tknSo?JQbMWQ$XuftZRr{U0 zv>UvWqulI)JsWE}I9OlOmr=f_w`C#UVEk1m(z+7iZQ=5OM(M;PV?Kb$>yj|P<7Db? zJM_CPdQX&eXwH^PS{+*mp|}Jn_X|&d$1_7bv%59K<^3l^e0g9UTKGr4GAU$^#A|> literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/date.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/date.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4735b26a80a2695310ab063a4272632ed76c69c3 GIT binary patch literal 3476 zcmbVPO>7&-6`tkaF1h?CZAp|!E+x}3(?qoEv~}Ggjs!-wQcL-fW1~b;W364wl*lDD zyR;*fvSl|wDL4g~Q(59>@XHJ_9 z+MKoItZA!3Te7wsou&=inq_kKv>j;M=P2zE&DSY`{+vp)D@?+^OW+ff?z~hiWW~v1 zCM$>-#=Z|$lpA^JQYLqRY0t=4Wd&!X1<-I$&%HmD$2nek7vns!ai@4i{797Z*`kuk zOY>A~>EvU9ZifEs6X1S@lzmwVDeWzyZ>fhZdW|Yki^S$oyX#eKZPp^wraIp_1a`(@ zc6fy9vU7IJ$jGpB_wu{!yuEV6&fm-LvJ3Xg4ZEYg{4Tq}Uiln4u>Vj$dBQXcS3zHE z-K1N06nHF)R|U8mOm09or&1|Q6N-Kx3mJ*e>QqXnuZZH3z^~}$E4Oax7BbRJsT61f z&oncmTW9i;aznTLS>$oTq&qTlo?wDM=*||c5Fe7s6>{8*Pm&+YB9@cl5--U&7BiB- zXOq*@mu8YP6RA_l!h4f#5W84{1U$)%1K^= z8P5FnD>WSBxI7t3}`|j;J9qZvAwis1CqjhGKSlqdLr%sQyEMlrBR%c=z z{!>r5;TcmsV|9ki<_tC1h{{IlmdG<$8=Bwuc^D8sHr|F8JihyFJZ!xafhr=*Dn!d@ zf~hUJN0rc`waxE*1#??N_Ps>I($)ZE;txg>tZnW+O0l=OCDi5$wxttr!a=}f+tSWg z*vAy;r4&Lqq`2Brfm!sl>CU%<+@9ecC7?AEbTf1dbSrclbh__)>^BiMm%u{$S#XpP zjD)^=ELk`9mLLoY&JgGW&v zu9wD@pVhI^zn)whAQ@SwuI!Qwi=%`?*11ap*e;0` zyCe|pl2~#nVS`iw4U@fMauJxkeoVpvCXplIz(iYjT;{Vy(WoJGhpg~ek#A)n(FA7m z%5)AAN)GlQ3QYxbR+Mz>e7-0tm`ttPt{WwYPG@8xvyf4AhmrY=)BrP(6pP8qbebFr zNmfjbim)2_36_SX-_pE3{^iA63V{q+yQXcsIYP5`OIg_4TJ;Iu1hh z%<8X58|Sy}&T{&Gv^ueA4{NNu^18~79Ml|$)nc{L%I%E{Fc}Qm>mE5?Tdv{i?8eOh zL+EIBBN)gNl{@7N+L36Ds+lT(*_djBO>WvFJN}XCht=guvP^4%aFwr7m2+iA^9@%g zs*{z-hVAJ~?kF$_b;=M|JMm!Z(fRMvKZfgrSAIgY)n9gM?10LSX~WU-#U0OZv$ojs z#2*~l^o(yGJ*EYJ-w3{=2H*KUv=zJv-ZJ0^Z}Iu}Sg_vnBPLiWf_uHpIaqXbQe za|Javps_y98PFU-%{jE^LQbezXs2xt7GlGs=$uVBb^m@%Hr}c=m1YY5Z%2*Obh`b{(vKbaGjdBoVtL$w-AUZ@P^gBAJ4%gnE4%fFzVN8Sl2X8|3$> zD?vTQV(uoRS^4iOQPP{u7s;AVcj&#c`q+MGPis@}tx|t2)-x@mV+YS0pO7ePDwcK1 dOM8RZPb1hD6-~_xq#5*8z!+z17G9tCegoMCY1aS% literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/duration.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/duration.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66e64bd6adca6713ece8ef2691aca91588254c82 GIT binary patch literal 8077 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 peqP^j4?XPIaIt62j#|U~&Y{4LJLmJw(M}5_kXr literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/interval.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/interval.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0c27a6933df2beac28360026076cec78293b9fd GIT binary patch literal 8715 zcmcgRTWlLwb~7B3Gvtg&QIsW-lw^w5!?Yf>KK5fj3iP8hqEHe8xhtUh@t?3V(853M zxpz1-Bt^yBEzk?`>fU=E_uR)h_nb5TQdj3Dp#1R6t9!&Lg7^>AF$z^`9DE0jF9@FC z$rO<$=g72e&X%U;C=!j?QuefC&Vk!h%9*C;Xxz4^n6zuoh1-slJI&6qxa~}F>AJZ( z+@@2Ww0F*n+f1rH?VIzZ8|E5F!bR|nJo__p&W~Fhv>N%kpAmD%cn{P~yo+}y93N4< z7a+}MuO50Wn8F9G0N(((!3X~6u~%p*QA(>Di%SV9nNHkZUP>i27wYOw4*wfjPNw*T z5G6I=%?HxQi<#SiYYn=R;$2Y^l9_ve;a-XhV&X0jETHEp^_GRWlw8c9k*V1qO)LuO zxHK*Zi->2#R7Oe&pTtwQ65?WN8ROYZ%93OTUnJ!lGNzHY=Z%9vi*UjZ^$#vX^#vi3 z@DCT6kV)Al*^K^k@@u=^&Qg-Y7?r87OBA!jGusSoi7#0aich4H=_ClK`Ouos{MHct zVQFV5LtcYSK)khA{#G#=z18t@#Lvg&@d)#1o@Xtq`xBL`!#(X(|SL z;cutD^|i~<;#BO7uRR3UsdS#rv*#51xdT8ZY9G}tfc!p3wSW%0s#wP-_y82OYc2ZC z6B0`axO$m;<|*Kl5t;x?V~mAI?LspQl$}A7Noe3yo`euU3_8$enV9AjWd|*U0T2De z7*u%M+Rs;QTRUu9u(WOO6*@=N&e1$Orr5`X5YWt{eqB*1sJR@tCwNi zyzv%vb;!E$5^apv=3#7T1zruF2Hw{t*zEVo#29m0|NqZ2)!=zprX$wW%^7bJ~JWO$8A$3N2|l_p?*F}<{yNo3HqF|3`&@Roh7tGsXM@Wc4B;VX-) zei#$~9;y|hNH-Sfph^c7y8G#+LhnVj_oC7}x#Mlv;Rc>&3$YP3Hj?K?OTDXV>}sAH zK5$U=?tOxCx%b@!bF6~Hu-ZGU^iCheVO))k=eY@s!)rIed3Tso#_W0KQmKbH<(Uyc z<(x2?!+H2RBfEyp_TNHXX$vfqZCowkOSr0tqN=RcOQuCwsBu*IO5*ptlCXk~tAwE* zrt=&gub`_x499fHnpc$yy2dIXbTJ*WOI4+UuB8eH-C3e+{m4pJ6@Z&2L?)zG18nZ= z9oW})W7PV;5VqPzt3sBDF>3wCYpBJm)50-Y6}-BQQR{!jx=vc-Mhnjc-dT02;Cqye zebrP1Q9)Nz9@wXWx6mCW=jpf59d#du-a>cO{X6>>y5H*_31~N?A
lNm5{nfZi( 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/resolution.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/resolution.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16b741c3dff328eb1cd39be5c73d6ed1d22ab34a GIT binary patch literal 1543 zcmbVMO-vI(6rSmBw=J|FNIdvMh)7HmWknQ?AsCY)pykKk#*Im{bSJQ|-Nl(LriMfg z9xxuPCpngQP=g1E2Q?n_XyS=*(Y<=&W>UO(^1WS(g@YzcvfsS-&CHv9-wN#J{tu#R>LaAx@7$ZhD%aU$vOEM-OUBj15~!0$`vr46Gk*@5G@oU3^r%-l%GuP z0s=q1OarFc--RfeqD8c*7Srmq`eG<4c?~JuW!IT-tb%Jg_6F`Wl8k%NY}VHEESvS} zve~?26fCsk+3dZ7Zf%XomML70GI(LG+Y`)_?=YQv;bF&iCp|gC*t8cxH1wh;r2rzM z+%Rq3dQB?$bHB&cTY_<+vT5BGlT)T`=$1M(baPl8zLe@x?-k4kd0n`StFz3WRV{N| zohiDLj@{kaby^js%TCVdxoLfZ301dE;hgU|)ur<7d^%@}9P8;r91PJ8@Q8d@yI0aH zm*1sV)1RB(j;^bzHTlGRYN4alQo3K3mNI;Qb=8hSM1aLsNdxS;5D=xd5L(AKM{le&)d~Uvfp{I0q@mM)r zzP}m?BH-d3I^kbptBe8cStp3HQztE*>EUkb*n}z+;b$^_;0N^9s-^~Xh3L0 zz?69t!eN9X2(1XaG-^W*0TmM`0YIa{^tWisg7P%}I9|H;q_HA}hN!Y8_y0Xj<;*L# zlKC(ZXoc%{Xtn*`q+n#vT1i!{f@^)#%-3FP7zJ%&|Ixg}%7B-rBt;ADSOn$UI{~wm5$z8S!GvZ+woPfNEq3HF;&O2_Ep0rbYelc<6Y SbenNX&y;Tef`K#s-~9owE<&OJ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/time.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/time.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc65c13ffa6f44917c8a91573c6d8c1a01777959 GIT binary patch literal 4519 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 TD-7!G%MD$4i4IUF$b|m`XOa63 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/timezone.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/__pycache__/timezone.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73e40b805ca4e68745cb7ba2db54567bc7f02544 GIT binary patch literal 2045 zcmb_dO-vg{6rR~#d;J5pu}ok|C`*XbnkHTdaYdx6X{!9lEg?`KiBPL_VHdODT|2vL z8eAh%TB$VU;GE*-#F2^~dgPd6q+ZtX0c!;kQn~nMmGr`?GmC#vW7HpYq}lmq=Dqj5 zH}l@?ug%RafZ8VmrPz=IfZy<>+K37`xP-tnAOHczfea@h#F&T^GC4_Fn2b}hZPEsT z2xp)`eG4b;i?)!xgbjqC*)p=I&nA>{Nftj!NpV3`(V|n*9%#BMDKRwhM91#jOsF!i z-%!a#~lkjFVy)};D36|@T zdFR~KDC=YWUg~jYhzvPHTnC@`1F%G8sK;>4o}uQN>snQ`Sphf)G`Pkb^Wh(}Q7D%x znc%Y`ZapazuwN(_S~jU8+OfLk(cPY;X@67mzjzw*58q5PxRTg(LJ?UxrRnUH$R1Tv zxP%Kr#nofN$?*_rIutR+>(YX#qUr`FrSP&?!WC7*$y~xw9Kwqx(bt#0FkBI3Q8BWE z@AdVwI_62t%xI#1#H1uFw!Ux)S5>{oqDXIV*O@dnQ>@Nr3Ks2)Cq?}jK9XM#!0 z&YFZQtN7&!(JJ=Ablv6SDbXr^lZ=as>6yYW#RKdC4phZ_rhUeGBTQP-1SuxzA)9H_ z(wnDCyzEeCVm+1^#U7+`YU zxog>vSDkxqU$*7@!L0V=YVOO8bI+H5x$=T~HE?~$&l=r#3jPtJX=KOQv^w!aNA}^9 zuK(XidjlVilka=Z7@g7W&XIiQh%tJ%(0Q-mxogd;x zvI8s2wL>hncA&$!vK1+lz<2%t5Iz@Dak|Qm#?nkKwh`J2{zdw=1GpK3xv|X*<(Z+E z69s0h;2Jlm@dI?rU^qmZOf56Ql^oSjX5jy!ic8S+)%S6l^7>Ih1nSG;qiHdzO9@4@ zszAj_^b=57G^lT(&!OXeIU%It;s7fK6rNr0uGfD!&9?cqsSSz1Bw@*?gtGSub*W^UZGzkLBbUQZ zvhz%g+r&j8)fN*l;EeiVn3sr3CK*a5S?UI>%%qFD?vqK5azJ^?0~M$M)D6}|%X9V0 z`Ol}O4Ao4e8t2%?kjH=hnr*Yd6iCt*AStllgv=ItnrjJKOo4sOJYt+BXtuEPaO<7x z7@LSOmU~vqpl*J)h7vLxZ zPl-e#uN3*Jq3VXL&L|n<*0h$PN?N{f;mRfX(z)@td^@M*XBER#b@`5(xg)2w8}i(| zc`KV4J{ljA4b4=K%qgiE<)&)LN=7rXqbH8VWjHx&2kPkDyd@@+T1GRI$$V!kfJd8q z0d(dgAPZzmBwc+a?pyDMue0pi`$u@N7M3ev`KkLw_-twXyTnE~ic=lXB-IEQ@&s>W zCtw41mmp}<_V!Nl?@6G{W44)u8OWpFPhHdQofdGlyX~gt1TmqIov}M|+AjGf#+fOX z2c~JG$WZ@Z!O)8Fhc zXRil!{syu@)_uVTV~b-ye&saQ6XivC^to?zT?*Hvfr>P+a^;unKVPp(BW3@{b|>i# zEsy_{_#sgX$(4}&Bw7g#S9?ZEfh~db4z6;)?pfPYJ2+N>U-wwazb%md=t^j{Q0+Uj z7%Xum4R%8NR${APSNl&@#GVpgns07>S?wReE%(E2u;%Gne!n7yOMwkv&+@tFzVNzq zs3r|nq@gFrpB{L2vMOCH`!BAyghMsyR7E=VbnsdCZwIQ<<+A_sMlfCrj#h%B>;B&5 z<0}VNPu5**hj)vx94r?IGAsz?T;a9PgG)THa(5+9;Ps-k(g~&M9d}qC>+I zJ%l8RWIvKYAZx_7WamrASHvb54+GKnNuBlZ`(AeK=e;jKV;Fw#OM&70>H^0PI*OQu^-jWcYzrSVgAc`};P=75 I2(Y&9KbgeXEdT%j literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__init__.py new file mode 100644 index 00000000..280a00e6 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__init__.py @@ -0,0 +1,614 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import calendar +from collections import namedtuple + +from aniso8601.exceptions import ( + DayOutOfBoundsError, + HoursOutOfBoundsError, + ISOFormatError, + LeapSecondError, + MidnightBoundsError, + MinutesOutOfBoundsError, + MonthOutOfBoundsError, + SecondsOutOfBoundsError, + WeekOutOfBoundsError, + YearOutOfBoundsError, +) + +DateTuple = namedtuple("Date", ["YYYY", "MM", "DD", "Www", "D", "DDD"]) +TimeTuple = namedtuple("Time", ["hh", "mm", "ss", "tz"]) +DatetimeTuple = namedtuple("Datetime", ["date", "time"]) +DurationTuple = namedtuple( + "Duration", ["PnY", "PnM", "PnW", "PnD", "TnH", "TnM", "TnS"] +) +IntervalTuple = namedtuple("Interval", ["start", "end", "duration"]) +RepeatingIntervalTuple = namedtuple("RepeatingInterval", ["R", "Rnn", "interval"]) +TimezoneTuple = namedtuple("Timezone", ["negative", "Z", "hh", "mm", "name"]) + +Limit = namedtuple( + "Limit", + [ + "casterrorstring", + "min", + "max", + "rangeexception", + "rangeerrorstring", + "rangefunc", + ], +) + + +def cast( + value, + castfunction, + caughtexceptions=(ValueError,), + thrownexception=ISOFormatError, + thrownmessage=None, +): + try: + result = castfunction(value) + except caughtexceptions: + raise thrownexception(thrownmessage) + + return result + + +def range_check(valuestr, limit): + # Returns cast value if in range, raises defined exceptions on failure + if valuestr is None: + return None + + if "." in valuestr: + castfunc = float + else: + castfunc = int + + value = cast(valuestr, castfunc, thrownmessage=limit.casterrorstring) + + if limit.min is not None and value < limit.min: + raise limit.rangeexception(limit.rangeerrorstring) + + if limit.max is not None and value > limit.max: + raise limit.rangeexception(limit.rangeerrorstring) + + return value + + +class BaseTimeBuilder(object): + # Limit tuple format cast function, cast error string, + # lower limit, upper limit, limit error string + DATE_YYYY_LIMIT = Limit( + "Invalid year string.", + 0000, + 9999, + YearOutOfBoundsError, + "Year must be between 1..9999.", + range_check, + ) + DATE_MM_LIMIT = Limit( + "Invalid month string.", + 1, + 12, + MonthOutOfBoundsError, + "Month must be between 1..12.", + range_check, + ) + DATE_DD_LIMIT = Limit( + "Invalid day string.", + 1, + 31, + DayOutOfBoundsError, + "Day must be between 1..31.", + range_check, + ) + DATE_WWW_LIMIT = Limit( + "Invalid week string.", + 1, + 53, + WeekOutOfBoundsError, + "Week number must be between 1..53.", + range_check, + ) + DATE_D_LIMIT = Limit( + "Invalid weekday string.", + 1, + 7, + DayOutOfBoundsError, + "Weekday number must be between 1..7.", + range_check, + ) + DATE_DDD_LIMIT = Limit( + "Invalid ordinal day string.", + 1, + 366, + DayOutOfBoundsError, + "Ordinal day must be between 1..366.", + range_check, + ) + TIME_HH_LIMIT = Limit( + "Invalid hour string.", + 0, + 24, + HoursOutOfBoundsError, + "Hour must be between 0..24 with 24 representing midnight.", + range_check, + ) + TIME_MM_LIMIT = Limit( + "Invalid minute string.", + 0, + 59, + MinutesOutOfBoundsError, + "Minute must be between 0..59.", + range_check, + ) + TIME_SS_LIMIT = Limit( + "Invalid second string.", + 0, + 60, + SecondsOutOfBoundsError, + "Second must be between 0..60 with 60 representing a leap second.", + range_check, + ) + TZ_HH_LIMIT = Limit( + "Invalid timezone hour string.", + 0, + 23, + HoursOutOfBoundsError, + "Hour must be between 0..23.", + range_check, + ) + TZ_MM_LIMIT = Limit( + "Invalid timezone minute string.", + 0, + 59, + MinutesOutOfBoundsError, + "Minute must be between 0..59.", + range_check, + ) + DURATION_PNY_LIMIT = Limit( + "Invalid year duration string.", + 0, + None, + ISOFormatError, + "Duration years component must be positive.", + range_check, + ) + DURATION_PNM_LIMIT = Limit( + "Invalid month duration string.", + 0, + None, + ISOFormatError, + "Duration months component must be positive.", + range_check, + ) + DURATION_PNW_LIMIT = Limit( + "Invalid week duration string.", + 0, + None, + ISOFormatError, + "Duration weeks component must be positive.", + range_check, + ) + DURATION_PND_LIMIT = Limit( + "Invalid day duration string.", + 0, + None, + ISOFormatError, + "Duration days component must be positive.", + range_check, + ) + DURATION_TNH_LIMIT = Limit( + "Invalid hour duration string.", + 0, + None, + ISOFormatError, + "Duration hours component must be positive.", + range_check, + ) + DURATION_TNM_LIMIT = Limit( + "Invalid minute duration string.", + 0, + None, + ISOFormatError, + "Duration minutes component must be positive.", + range_check, + ) + DURATION_TNS_LIMIT = Limit( + "Invalid second duration string.", + 0, + None, + ISOFormatError, + "Duration seconds component must be positive.", + range_check, + ) + INTERVAL_RNN_LIMIT = Limit( + "Invalid duration repetition string.", + 0, + None, + ISOFormatError, + "Duration repetition count must be positive.", + range_check, + ) + + DATE_RANGE_DICT = { + "YYYY": DATE_YYYY_LIMIT, + "MM": DATE_MM_LIMIT, + "DD": DATE_DD_LIMIT, + "Www": DATE_WWW_LIMIT, + "D": DATE_D_LIMIT, + "DDD": DATE_DDD_LIMIT, + } + + TIME_RANGE_DICT = {"hh": TIME_HH_LIMIT, "mm": TIME_MM_LIMIT, "ss": TIME_SS_LIMIT} + + DURATION_RANGE_DICT = { + "PnY": DURATION_PNY_LIMIT, + "PnM": DURATION_PNM_LIMIT, + "PnW": DURATION_PNW_LIMIT, + "PnD": DURATION_PND_LIMIT, + "TnH": DURATION_TNH_LIMIT, + "TnM": DURATION_TNM_LIMIT, + "TnS": DURATION_TNS_LIMIT, + } + + REPEATING_INTERVAL_RANGE_DICT = {"Rnn": INTERVAL_RNN_LIMIT} + + TIMEZONE_RANGE_DICT = {"hh": TZ_HH_LIMIT, "mm": TZ_MM_LIMIT} + + LEAP_SECONDS_SUPPORTED = False + + @classmethod + def build_date(cls, YYYY=None, MM=None, DD=None, Www=None, D=None, DDD=None): + raise NotImplementedError + + @classmethod + def build_time(cls, hh=None, mm=None, ss=None, tz=None): + raise NotImplementedError + + @classmethod + def build_datetime(cls, date, time): + raise NotImplementedError + + @classmethod + def build_duration( + cls, PnY=None, PnM=None, PnW=None, PnD=None, TnH=None, TnM=None, TnS=None + ): + raise NotImplementedError + + @classmethod + def build_interval(cls, start=None, end=None, duration=None): + # start, end, and duration are all tuples + raise NotImplementedError + + @classmethod + def build_repeating_interval(cls, R=None, Rnn=None, interval=None): + # interval is a tuple + raise NotImplementedError + + @classmethod + def build_timezone(cls, negative=None, Z=None, hh=None, mm=None, name=""): + raise NotImplementedError + + @classmethod + def range_check_date( + cls, YYYY=None, MM=None, DD=None, Www=None, D=None, DDD=None, rangedict=None + ): + if rangedict is None: + rangedict = cls.DATE_RANGE_DICT + + if "YYYY" in rangedict: + YYYY = rangedict["YYYY"].rangefunc(YYYY, rangedict["YYYY"]) + + if "MM" in rangedict: + MM = rangedict["MM"].rangefunc(MM, rangedict["MM"]) + + if "DD" in rangedict: + DD = rangedict["DD"].rangefunc(DD, rangedict["DD"]) + + if "Www" in rangedict: + Www = rangedict["Www"].rangefunc(Www, rangedict["Www"]) + + if "D" in rangedict: + D = rangedict["D"].rangefunc(D, rangedict["D"]) + + if "DDD" in rangedict: + DDD = rangedict["DDD"].rangefunc(DDD, rangedict["DDD"]) + + if DD is not None: + # Check calendar + if DD > calendar.monthrange(YYYY, MM)[1]: + raise DayOutOfBoundsError( + "{0} is out of range for {1}-{2}".format(DD, YYYY, MM) + ) + + if DDD is not None: + if calendar.isleap(YYYY) is False and DDD == 366: + raise DayOutOfBoundsError( + "{0} is only valid for leap year.".format(DDD) + ) + + return (YYYY, MM, DD, Www, D, DDD) + + @classmethod + def range_check_time(cls, hh=None, mm=None, ss=None, tz=None, rangedict=None): + # Used for midnight and leap second handling + midnight = False # Handle hh = '24' specially + + if rangedict is None: + rangedict = cls.TIME_RANGE_DICT + + if "hh" in rangedict: + try: + hh = rangedict["hh"].rangefunc(hh, rangedict["hh"]) + except HoursOutOfBoundsError as e: + if float(hh) > 24 and float(hh) < 25: + raise MidnightBoundsError("Hour 24 may only represent midnight.") + + raise e + + if "mm" in rangedict: + mm = rangedict["mm"].rangefunc(mm, rangedict["mm"]) + + if "ss" in rangedict: + ss = rangedict["ss"].rangefunc(ss, rangedict["ss"]) + + if hh is not None and hh == 24: + midnight = True + + # Handle midnight range + if midnight is True and ( + (mm is not None and mm != 0) or (ss is not None and ss != 0) + ): + raise MidnightBoundsError("Hour 24 may only represent midnight.") + + if cls.LEAP_SECONDS_SUPPORTED is True: + if hh != 23 and mm != 59 and ss == 60: + raise cls.TIME_SS_LIMIT.rangeexception( + cls.TIME_SS_LIMIT.rangeerrorstring + ) + else: + if hh == 23 and mm == 59 and ss == 60: + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + raise LeapSecondError("Leap seconds are not supported.") + + if ss == 60: + raise cls.TIME_SS_LIMIT.rangeexception( + cls.TIME_SS_LIMIT.rangeerrorstring + ) + + return (hh, mm, ss, tz) + + @classmethod + def range_check_duration( + cls, + PnY=None, + PnM=None, + PnW=None, + PnD=None, + TnH=None, + TnM=None, + TnS=None, + rangedict=None, + ): + if rangedict is None: + rangedict = cls.DURATION_RANGE_DICT + + if "PnY" in rangedict: + PnY = rangedict["PnY"].rangefunc(PnY, rangedict["PnY"]) + + if "PnM" in rangedict: + PnM = rangedict["PnM"].rangefunc(PnM, rangedict["PnM"]) + + if "PnW" in rangedict: + PnW = rangedict["PnW"].rangefunc(PnW, rangedict["PnW"]) + + if "PnD" in rangedict: + PnD = rangedict["PnD"].rangefunc(PnD, rangedict["PnD"]) + + if "TnH" in rangedict: + TnH = rangedict["TnH"].rangefunc(TnH, rangedict["TnH"]) + + if "TnM" in rangedict: + TnM = rangedict["TnM"].rangefunc(TnM, rangedict["TnM"]) + + if "TnS" in rangedict: + TnS = rangedict["TnS"].rangefunc(TnS, rangedict["TnS"]) + + return (PnY, PnM, PnW, PnD, TnH, TnM, TnS) + + @classmethod + def range_check_repeating_interval( + cls, R=None, Rnn=None, interval=None, rangedict=None + ): + if rangedict is None: + rangedict = cls.REPEATING_INTERVAL_RANGE_DICT + + if "Rnn" in rangedict: + Rnn = rangedict["Rnn"].rangefunc(Rnn, rangedict["Rnn"]) + + return (R, Rnn, interval) + + @classmethod + def range_check_timezone( + cls, negative=None, Z=None, hh=None, mm=None, name="", rangedict=None + ): + if rangedict is None: + rangedict = cls.TIMEZONE_RANGE_DICT + + if "hh" in rangedict: + hh = rangedict["hh"].rangefunc(hh, rangedict["hh"]) + + if "mm" in rangedict: + mm = rangedict["mm"].rangefunc(mm, rangedict["mm"]) + + return (negative, Z, hh, mm, name) + + @classmethod + def _build_object(cls, parsetuple): + # Given a TupleBuilder tuple, build the correct object + if isinstance(parsetuple, DateTuple): + return cls.build_date( + YYYY=parsetuple.YYYY, + MM=parsetuple.MM, + DD=parsetuple.DD, + Www=parsetuple.Www, + D=parsetuple.D, + DDD=parsetuple.DDD, + ) + + if isinstance(parsetuple, TimeTuple): + return cls.build_time( + hh=parsetuple.hh, mm=parsetuple.mm, ss=parsetuple.ss, tz=parsetuple.tz + ) + + if isinstance(parsetuple, DatetimeTuple): + return cls.build_datetime(parsetuple.date, parsetuple.time) + + if isinstance(parsetuple, DurationTuple): + return cls.build_duration( + PnY=parsetuple.PnY, + PnM=parsetuple.PnM, + PnW=parsetuple.PnW, + PnD=parsetuple.PnD, + TnH=parsetuple.TnH, + TnM=parsetuple.TnM, + TnS=parsetuple.TnS, + ) + + if isinstance(parsetuple, IntervalTuple): + return cls.build_interval( + start=parsetuple.start, end=parsetuple.end, duration=parsetuple.duration + ) + + if isinstance(parsetuple, RepeatingIntervalTuple): + return cls.build_repeating_interval( + R=parsetuple.R, Rnn=parsetuple.Rnn, interval=parsetuple.interval + ) + + return cls.build_timezone( + negative=parsetuple.negative, + Z=parsetuple.Z, + hh=parsetuple.hh, + mm=parsetuple.mm, + name=parsetuple.name, + ) + + @classmethod + def _is_interval_end_concise(cls, endtuple): + if isinstance(endtuple, TimeTuple): + return True + + if isinstance(endtuple, DatetimeTuple): + enddatetuple = endtuple.date + else: + enddatetuple = endtuple + + if enddatetuple.YYYY is None: + return True + + return False + + @classmethod + def _combine_concise_interval_tuples(cls, starttuple, conciseendtuple): + starttimetuple = None + startdatetuple = None + + endtimetuple = None + enddatetuple = None + + if isinstance(starttuple, DateTuple): + startdatetuple = starttuple + else: + # Start is a datetime + starttimetuple = starttuple.time + startdatetuple = starttuple.date + + if isinstance(conciseendtuple, DateTuple): + enddatetuple = conciseendtuple + elif isinstance(conciseendtuple, DatetimeTuple): + enddatetuple = conciseendtuple.date + endtimetuple = conciseendtuple.time + else: + # Time + endtimetuple = conciseendtuple + + if enddatetuple is not None: + if enddatetuple.YYYY is None and enddatetuple.MM is None: + newenddatetuple = DateTuple( + YYYY=startdatetuple.YYYY, + MM=startdatetuple.MM, + DD=enddatetuple.DD, + Www=enddatetuple.Www, + D=enddatetuple.D, + DDD=enddatetuple.DDD, + ) + else: + newenddatetuple = DateTuple( + YYYY=startdatetuple.YYYY, + MM=enddatetuple.MM, + DD=enddatetuple.DD, + Www=enddatetuple.Www, + D=enddatetuple.D, + DDD=enddatetuple.DDD, + ) + + if endtimetuple is None: + return newenddatetuple + + if (starttimetuple is not None and starttimetuple.tz is not None) and ( + endtimetuple is not None and endtimetuple.tz != starttimetuple.tz + ): + # Copy the timezone across + endtimetuple = TimeTuple( + hh=endtimetuple.hh, + mm=endtimetuple.mm, + ss=endtimetuple.ss, + tz=starttimetuple.tz, + ) + + if enddatetuple is not None and endtimetuple is not None: + return TupleBuilder.build_datetime(newenddatetuple, endtimetuple) + + return TupleBuilder.build_datetime(startdatetuple, endtimetuple) + + +class TupleBuilder(BaseTimeBuilder): + # Builder used to return the arguments as a tuple, cleans up some parse methods + @classmethod + def build_date(cls, YYYY=None, MM=None, DD=None, Www=None, D=None, DDD=None): + + return DateTuple(YYYY, MM, DD, Www, D, DDD) + + @classmethod + def build_time(cls, hh=None, mm=None, ss=None, tz=None): + return TimeTuple(hh, mm, ss, tz) + + @classmethod + def build_datetime(cls, date, time): + return DatetimeTuple(date, time) + + @classmethod + def build_duration( + cls, PnY=None, PnM=None, PnW=None, PnD=None, TnH=None, TnM=None, TnS=None + ): + + return DurationTuple(PnY, PnM, PnW, PnD, TnH, TnM, TnS) + + @classmethod + def build_interval(cls, start=None, end=None, duration=None): + return IntervalTuple(start, end, duration) + + @classmethod + def build_repeating_interval(cls, R=None, Rnn=None, interval=None): + return RepeatingIntervalTuple(R, Rnn, interval) + + @classmethod + def build_timezone(cls, negative=None, Z=None, hh=None, mm=None, name=""): + return TimezoneTuple(negative, Z, hh, mm, name) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16e49e49f31f6f0b031cd3f11087a6c253b3dd40 GIT binary patch literal 17587 zcmdr!TW}lKb&L0scoG1?HwnH8k^&`BPe)IRlt`O|Xp)L!G&T%zR}v%wkQbm7B49BPeJODc+5rWlG*%}{=P zs%KPTwO_5mvSvmT*7~(!onIH$`}JXi-w>w#bhyl47B2UfhmC$?*yJ~b&3?0rQd6v& z(O#t(-Op7Yss;Ie3xVnZYEVF}1WGeyO!-x{Olu=hBhZ=@v=szu2B<{=wG*fnpf&~6 zL7)`?wJV@b0(Ah?seo3pt}7~5 wn96%9e--1pNBOJO)CG#Ex<@h9Y|V!n@hfTx zv<9HHY^@Bfn^Sq}K0^|pN5z*%f?<}4&)%G2J>|S(FgSN{Hh%HSKy)_3#D+L7%JG%M z(OE851h$M!UOXS=!oj#eW*udNHz(QYXoL{}jTB0{bvVqcV=-PGPw+Id#sSA`87T2uQl%*HT#4Kolq z6&c11U{jGvo*s$BS?*SFW=+HEV(}ms=QV7E;b}$`!&gkOH(8JvxvC&lP4JqDNQ9?D zB0Eo`mWgPDUDNS&guMzJw^&}~=c=JQxf;lLEp{lc8x4g+agUz2P6uO9H}qpH&VhJd z6Ancn3x0#QaKXq`mi@*wdlNr}w+ZhG+A;#UG8>tmmS!G~8!i0d7~6gcvSq3a=1@|V zq&|c>iD_P!)J;;YR8rkWab-BelA5Ge!oH)rO?^Z2I(1vMrt+;(prQ^MW|rkms43PZ zC^H?Lg`p#B7vrt*Yh3hpM27HY0T5hvJ`eR>im_a*kG&C$ z#I9WrMVR1B-^j?+Sl`&$!2^A7&xR6V(mZ{)*vPHEnb76Fn{)AN(MZ4dz`?#)D9-M? z8JxZW(qnzWNGKLPc4Ys7zRRbTr-N$8NI>N+-0L3*f` zjKjPJC{TrhbhjJ2uq5UN)Wy{S&RD<#uK+a_L-PXx@Rnk{SXT+mjln;nF3lw6(fB@B zc|9s_2x|4vyza_OGze1>rWffs?ij$ifvnb@l5OS4a-Yu`lT;LYqTwlZi7P9G-gtg`hNQ@7;DQEOZim{IkMs z#PljK^#rp|#CR2$27>7mG5ZymMuIsYVh$=WO{|`!*>cvznpq3e|DN9OW^JsUbux$E z)A*ZNa530gwvMf58`wtX@OuV-3v+~R3aR|9EVw7k(f8E;Hs+YWo$X+TndA3VABv;P z-wBWr<|PHB3m{*)N68c(wxf(`xXu5&s73QP@(nBDp6p&tkj54PckbR=0GYXg& zsK%JH3P>MP?fj4NF#`&U{Y1_Pb4~#}KwuY{K?Up}$R1LBNk6=wSG*sB_X~>m!*i{k zao#!*jIp?=4+x7&!Z{KFOA}(;bKuChg*DsDp+OH>J1HvBfDVp3JR6I|A05I zGw5Oo{gEKXOFzCD*{^mA?d?tHg2if{R*Uzt?;4ko$HB+8Ul5dlQ@xHiCYf zJ1ly?-h@k14qPwrePy}0$RrvBhq#pF!_c8JZ;W`>GB2)8i8F$8T#EO|enBgE?$9de zo&h)AElBew8YI=wtwqPuz2nQPu$H=AzZ^QRsYt-ikIdIV2DIexO5fp2bW5%@8Sydq zbToVu^oYdeueuopPYnEAZ=zAEOc>pT!V*2QEJCoiF!|HTs4bF}*9-A`i>jCO!ckWw z$s=n8=)DEWI+0!|l9bm8@q3GsJ4Wn}B4NF>dKRmrT?a7=LdbX9TUb(HUEyKD9Kb>1OU#c-gTF`y#!$0C247xXbX!f4k5ubpVUu z&Y)N`VhDE83~^Sdmt#;S(Fj{kN-w67M$o7MxVT2hVkkmxA4|Rsh$fA@w-MqUJGGJA zSJddmw4nuUnt_39!K@XtHq6>F>%a^aUW)9@NOKkGDh}bqZn}#2D$po~v8@H_IZatx z(age7XX7M1Xws9%1jD90w61!8k9gJ-u)B@GLvBy}Btg=yXZTYLj-@vDrKsdQY}RBx^{#wC!w{^@2U|RuPqQl@&@com^Jy5Z%%|Oz4`>*ImHD)c zPUh3?$_F$I!ODEF<&^pKyYc}IL$ETRKB>8TEUC$dMM?!kpgraIE@MFHB=k@pFO&L* zp-TolAV>n7VhGMHB&ZAaZO3sHs9!i@l&g)(^#@jy~HU!-%+6! z7;{VNlKLxp2z;1)d#_X66nt2s>6`oK-JzH}IvaOKueeDJ!+j;nxxaZ}e&06_&Y$OA zM>4lW7MYoI3!4=rB7P-0d0vl!w+^128VXFD^<5YW433{0EsG*bLnwM+#>Qfh zLFf)*b(LvjeXhDLTiuhX?pYk!G*&FVo-sD&9Q7+-%{bb!4sXWcO~uz=e{?Hz`22?B z!s6hj(Ykaz18fzwD~BF5Wh=Tf72Tq>~$+c8GB3C z-kY)arY6@tkA^Y_2R7{I7SC-OElZw^u`Xw;S!sP>$=bRywysn~YGi$S&9`Cu%Hr8g z+H-pJ5$=!bN|jte8bw7(q*js)>|Jr{=SZ~{ zb}&{{E?r(}S(#ovusWT#cBkp?Vk3_J2{DqtB}S4_&Fho8T@9rU44w`QWlb5Cgz~N? zK_y{jlb`}qf}GWW+1-?Y^a4|&W(+bPF%l(Bvj+GGR;~|>#9c#D#c0R`S2Hwxm!6?v z+Ser2cXdfMQ+DGh3`7H%DqB(`ym3Z_Ah5AooqNJxl#16a8~!|dxQqzRAU#JzpY z9pqSdBpP?eW^dk%a;sYGka)FmpK7xK}VkFNJrF4xJqjOb(s9=o_32OkNrv zzc?{9G{~C?^WJu0a#eMU!&`dF=Y?HOl#)_El3JhH>M+U$kQpSqx?3mdNCv~3vdJ)*yayb8zCz>0chAZ=|*(@lSP zKBA(Wo@bQSTn%RzEB5anU*W!Y>U}mf@YkXBmY+vHsoj_MPHog)N;@xYx~i58|FcyF zw4cW?n)IXU!Cvauy=6nKnqMFG3^i(g)2M^;wCq^{jqDvig02PcnBLXs)8HM`#B@Vx z50fuqWfP3vvBbCgQUNq2ykm)PFYlNx;T=nSdwIun3GZ0q+siwqOL)f;-|kDA9=@-@ zJBB4q;@f>m1Db**4VJUK$C)%-F@VoW`?zN4%)NKj9yQ!KxHNHgYUHA?&|UPDz3ASY z*q0a%Az`})xv*n%?(p!WeR|uTexOKo4{b|_U|XsczF=Rbx(|K97xAwCpVHVIOOq?D zE3wscDMt$2w}WZ=U~zm(cHiEDet}u6-E|ggVHRu2EQZpqvsj%JvGOd2<7^ytSMX?8 z?GwX%e8a@h_z(;z--W=4Z)#}bt7k`xMwS>A+Zmw{MiHt_Mv*Xr8kHlcI0ljM?lqQ* z>3@Nv>O53Yu){c>sXqRKqsmsX)W1Tft@)^+?681bxz*njT3x?utHT|lq@J`oly+@( z4Y;NRE4R7^Y^TJxyY18h-_FQ_Hg6-Y!2J+7jL*kg&&(Nt*h9f-Rn{dZl?~V%5GnrQH31A1NoaW@Ps>0RAb2 zr9melB~|(R9a5)oli)F9*B2zXVWA9*iCBQ5n^%wkT4E;w&=R`@fR?zQ0nieAf`=;U zw!q}hufTXYN%B{mgs;G`c|iiXt^yFe0u)`%f&@?u{1+sE))#=_74E%=zJGyc7?vhU z)~o|GYnGt-C&+Edzey#4wn^puQ<7CsSBFF);kh@VE{_DwKS64D{!Jy383Br z5WE5u!?6Vkpa%;;@Cs0jixwn+Vq~-+J=AHh zfSxJ|JyQ&QsFlKQ1v(5!v^#VdlA!q~)P{z+AOUo^00gf9eYqI=P?y&MzH_XY0{DC- zq2nc?UuM)#6iaxh|4_6EU~UaQazw_V6D}N!;TYp^m~j1&dAj-XP%IRI>xq$RmM_D5 zk5hOpl$%BpoY=b_bMa+Uup1MouOeZIJs@wEZc++#XkR(`5D2iM-z8wfh{XxFxBJMO zN5o?Tf$b)8;4I0Xitw%p>5O3~Z5+u8Jb>E>%by3}Scikd%kbdKZw9#-8^;!jp`Di2 z8FN55$%tOQ&Q8Y@4Tb)|4)kwuW%(6ka0CQ3gsF8KFXB_RT*FT8%0#+qrU*;%6IoXeecb!1!}sh2UloUt}TYiBFFGL>C9 zOZB@m_h)j}ns?{#&r6Sry5*(^Ov0cJnMjLb2d zzHmBDMluZ{cruQ86O`~IS{T*%8Q?+*es6Uk6qC>70zemli`~T!`!{^%jWlxOVIY*W7Vt!)u=IUC1dh*97?~iWQwJwfs8mqF#dI+AUjcq`-X>|(C zje1E5{T9;Pw;;zK0L*LPPYZuK_|xxbT)CU%#)Zi1yf#t|O)NLOBp7ba;tkhQO|Ml* zRhRI+G)eWmKGL&;O7^ehx*@h(Qo0`CrL@sOhpXW#wf^p}lKN7f*@7S7C4935UtDgn zq_z|%Kuhp}v{F8uzLZY~wDx?n6_y6V%k+Cn-t>icTU+4yB3ve7d376IH zzM0gN@;L8KBz1Skle$v4(i|k_el(7|E0Tb>ly|Bt<(&ep?1xJH;CYnPEbqyZ5d$X~ zcU^I}#C5$@D&?Pd;Os&go8U3+Ns9-Gd0O1KVIZD(5+1u?ZoZEIR97%J#PICtGH`eW zMX*vkodw=Rmhu7NJ|u^3f*4um%gIkC1k+^|&5>-&ECLez5P?8=m#rJIb-2MJSne-D zEN_jlw|7`ToV8#9NfOMU8_Zt#awx(|<}Ys(iJ(|wf6;>f1srf?nu`69_yC(V4U3i> zW}6T$Het-zB&@W=D`@Dv?}HF>W7kguKMpMVat)nA0ZF3o&pk07$klb z*7Rm-dUI9n*{ZHgRadU6b@|SNJGtt%Y;{+rx+~{uS&lr2$nVe1hF1FnEBGF*y$WuD z=|y;#tXp=+?itRRs?(;nRQ*RyYfX=Q*%M=# z6Jw7(W8gW}x91#9%cmclE_^g+9c^$l`@Bq7Z&@70sD3qkbjpA4zLke5@ISH{Y5D-*ouKQy%j4L6}oa9>T=^ zEsPud zFzy~Aj8p!AL`q&{8eBAayBx+H_lf%NfQkC=fJv$@OhWjngy1SPZPgwJ0NOc*s76Y*NTxgzPNHmVxXM z?jYy4F#9%U-^FYRv!7u0SD1Z(*%{36dJ-`w+$5GTn}WZX3i|RM^;Az))#vEO9Bm^1 zpxl|G9ouF@m44ykQyW!To1>d@bXkrr&(RGzxKDdDEC2;;U5;+sfpq}{Bnw!O z+$&&R`UM~GI%{%tGrLJrq3$Ea++To(4v_0sYQE*9D%?3s9saX6>-v!Nxe zt=-hwo~c#3mTe8Cuh_y8$kSJpf;}xkw>kFeGmS=OhtgI#VOPsAD8U8|MV5jUSG_qt z^-R;Q>k&1A(w0v}_`N!}2!ztsTL=VY%@sM5t?-}S^~}+#>lewPwDmHQZyr1GOj9PS z2Bj?*f=9-lX-smJP}-^o@Kbf4u3QuWrLD^-;;GuCs}zAy5(!V}MpOj&REf>8I1y>1Bh1fLlZr#fuGbE8J&X005tFeECqxn z5Q73z1`sntDWi3Qk#YRYRDwq!flUvpBD?H*e27#sMmNc=z ziK;0Kwup|P;%@XXI#B3RlOPIQfO4*Is|QzOsk5orhP6LU_Y3<*Wjq|0C~VSg^ig+i z(}jb}d?Z*>kL;kY0C~YhX%1J0lFFfbIflwPfC4tXRyZ6dLH>yiYgd}?64a7<7HB9~ z00gygS5T-{-sP55B5rjENMk4j+*Dyz!Br|zw@YiGQm>*?=(D3z^(#}Whm;D*dsQGn z7l5==8x#r^lCBgc4f%Mlq}q>wo|}QJ_+|%(3utNm#F*bD)DJfV(4*y)tzl(ywH5mF z+`40Z`ceOe^>ms(Ei@iBn3S-8iLMyhFV;05iiueT{QD_pY0Pjwl6@i>Xrwo}yr*^s zv3U<{6<;wskJ>zd!aa&CY--&h(Nsf8T!mCRj|hVjS?q9OD}<4SO{+U2SoJM67Pm}b z|8ZrM))gqptK~6S=&=GAia#c3i#mGhxdc4GJB`lFKy(>?924WP^LVHHb9Ar#gZLP^ zNh{pt!XD?atI35f4yQF&jv4Xialat!JBSS?mX6pKGKM~(I*w4i5cC$@+EoOf!Ax%L&*>Aw&gT@D0R-%Mso1|l2ETPzskZHu%Jv^r%kQ;D zmHPLTls&Db%vDRb9ygueFkM(E`yE85;pOOt=@`7&YFA!L>DTq?&Z8T)V+&>g!BJ7VlM>lL^3+Df%?K!RS zncAS!Z|lm-)C;;TH&xZV^hVCvlC!(EjV6`-S)*N5@w_`~P>raTt~{qm;W=YpwmA^*l>~|e!fu(rYY0BdCEL*nX=4Vr>yg~DI2Lb z%-QE1Q;vD(lyjb*qUT*xu6g&Ad)_nUnfFe43662jH}9YFL*6tMV9ZlhjAbgwSf{EP z+f)r(!&WZ=UsJVEs$*-}I#R0FQfvcb{{r~LXR490v5llA1i28&H8EDUiR79Y3)@U` z``9We*TM#*Tq{e>UKHu5)7f!#NzBh)+6|iu120;}!8jTEmi7y+h%wd4xIUz&x)?X4 z-HZp)9xe46#dtrY7$0l=LMP$%-qVErUt?iBtP!lS$UMs=7VplnP%_<(aEWMSE^HL& z(~&qk8J%ZOFGlAWmJ=)^kpw%5h=So_bUvC8?4%^u>t`bIgka+$v0Lo)%x!k&PS_-P zMMDet{e)#*>Y`ic;e>GIGc#h!|ZTS6 zL>FR_x#5NRy9+TkmJlp=xoB)AdN(pB_~xTC+(Mi%#BSBsD8d9H1)?qhXYZhxYO^qLSLAMiz*xR9H9uHFhUx z`olUwH^;^V!`$p*Ji+0L1d#dN$lM|eWq^|zHN623l;hZEC=~j`t-fnUWgs&-9OM5k0#ij zyOEhYky~uMFA|H!7Y+~h@9(=Iid0;}?Y(vP>16f#uh} zF;iw+`tUzXW!`yW3Kl&zk9r^WuDVx;bDoa0>6tB%d2iK_v$bXQZ7-n}HKQIo93?Ej zTp`LPsae+C1BH{+yi0NJ(i|j|*@D@S@+n=+n82YVPfC|S`5;eHlhh@(vu3$m`u%=hL}w?vnn|B=aTVD-}gI{hRQWWl4_yOTf&xe z0QJfF(zndR&oodUD8c2N)K`U?J0l>q|J1(pL}ve>>4jzKNZjTY-iyt%@i<6N*v=72 zuAfFNGo4tNzNsw4=^14u>Y}j(X8|q+8u3_EHz3Z@*e$^tjYnhgL?kxDa#e_7xH-2F zNeH_6XiRVt!DHW_VejJN7F=Rk)m%3pc^|Z*6*SJfupj`5YXmA>2uYc-vzv>t8NonS zlwe9M5DgeNLN%--c(`W745-*v3;Q9cJPV)rzkvjV-9%?iRR!8xG+EQP@Bh(LZ_QTi z;f>Cmcl3eznKzI&KeM|s!Ii`7hw=x`@(0dt+0QMHJ~O#9ty|UITc)0;o~jk|Cw&i0 z&piIj?N55rrlQII$M^2v%bMy|tJV(vdg$|^Crt+nPH*1X%sZP`59Rj_@%x5y&Ldg# zkspL>b1h%wT7c~xYED^fzl0i4a~j;?%O6G&>NjDbrL?fHlm(mA%0dXsrv%k0Py>iN zg?lWcR)9+V5-iCjq-sTpO_THPME8!4SVY7foEXPrI5Rs6Cg6qJ}Fp0n?J^{%x zwQZ(qnm=p!v|&w`tM2CYp#0KrJfl6CS3XKEpM4svT{-tFXIAeo2HMv;`M|-A=D*f$ zp8F3@{>V7*pI9D$W@}h^f2|>BJDk-Y7N-a3Dvzv>UM68^A5kndrD3QkEf^L$M#Ji7 ziOHs5lMFx=%~h&lO^kNdT`J4DA3{T(64vqst`~Twtb`LCqh}1PjWI&W&N^79jH%$! z1kVI`X4b`6Bs}*nJP*OM0-lZaGIj~iw+qit@X)k!!Y^}5c!6DbRRoVFctHiPdKX>| z!E+J3S_Q9e7ap3II>t@#8Wg<7U3eja=OK7D1#kDbG!Z;6!GqqRgyXk+T$%}tX#&;IVG14UFCzww?{KO>8r}kEwcWnrde| zn06-kq2>#Tz*HC@9ZaS1N z8xpDYF4fDdk+EVHxd?9Iaxddc4RZZFo+3i!2&MKgns;_r*U8P9$i3aQO6O$AchPQ? z8%x8sH-a=a-cWjo^}iC=DXSj4j}B$O?MQ;qcGQ z#ktc+LOV7lXh&f1ufO-6pn>m^k&#^+ykHgk!PZN4yH zzUAZ^FJKpmHjI-MVljiq~P|XPpfmz^s7(3EqU)@ z-iz(yIqz`RK3ufP@I$=!&^og*{FNr_J(TmF&)UyFqpLnnJxHxgt`4knIl41z?i9@i z^`xR%K#ovF&??}s(WDIUF~Y|LAM>{h))#tc4bPkKEen;(veT3fSn{^VRfF9qnFL~6 zF-;i&jzV4bq|7mWQga^;!6}1^vbG{+ZAHo;;(Joo0%a}OlPYVpB4u4g%BG}lPs%!= ztV@{^irF>mDEnzpOqy|NCQUbW38!3}P!56#j|{u1la~V-X;`)?6U>c)(cS?glfwmU zfQ5J|ftvz(DjfkC9sVOdQnP3Ympw_nY>9uVm(_)eBKl6so}?*h{?Z`N?Gn_^)|R0_ zQQrJv;eSv5zBGOz$*8Ku_v;_c{IaLif7mo$+B`XQ&Ve4*qoNm#qCOXliKS@l=0aF2 zm_!907wjqzP&};V-hy@<`g+3jPCbMgh3mpv99<3>=BhC{35gJ#W}>+7-+hz`2E7NBuu3ZtTc7eyvjbED_txzGh<*s5s4p|4@m}O_+OoLo8 z>|7!OzYVg9B|(qhVGDN+c^k%L1d~y0t%Z66j!0ZEi9-_SeuA~+B!h}uI_SvfUr7@p z$-Olp*8VSO8~`pr=Ac+(~^sS2j;#p=3zbq`dHu#lbFTXM17}*B zKAq8KPCv8xGdH$sdbVu61z+IN#fKNuqlMb~eC+^VJMiFQ!9l0rhKls48Zi)jH1}{W z{n{?XKrsE<_eT82NjVzw_Cel0Sg;2R4o~K_mFro1>r+SbR?E??mW*6sPmNO^1Xo)+HIvUYv**p}zgbCb?}S@U}{Mf)Gz{OIERD5RTjOx3R6BBj|_1+?3mmFYw)GK}gS(99)KG%$g zb)r0*z!`KS8e_RzKo5XKY9}GjAzQLvQ*_2SOB*i{$k4ZK&4|$o@)#ckI?EJnmw7tG z)1f@w!P6ZDJ1q?>le6zzy_#V6S>x7FLhd%b(_*!tl}7|_bpr@WDNfbGT+BA zOPaorjHWl?Ti!*{G)tM1rdhQ0%O24Drdil=%b%2`s?x~hKHxJ~wIYkThp>#t5S2Qez@C^gstK%ok75Bn4HDr z946;6xqt}cc)_|l zu&P_Vy0#DIugA)p!)aamYGz+1zB0V(U7Z2{j5qM8=OK933RN}vsy@D|FKs7M(ZthD z1-Gx@t1VQw7JO9&k01Vj<1nEZm}D_fPl>XW{+yUq-)2TBTRVu2IQ?MobR@O++n|+t zdBU&4r?i|>`aLj|1%+lo(r{CI6;BA2XerJ$I0@(~2^B*vYTnnxPiiQr$6rg?Kvnjht4xjx-f-ENkSQjOOCY#pgwcIjDpekD#XSlxP*sHBTRFv9uH@&}{9sOD zP6(%ZkP0K3YgmGq5;2Mb2Tlv3c=uelqQQfb!Eu!e*ibzzLf` z->Qy{F@jmv8iI{L7bF`6>ZGhw#*oS``KZRR5SrpxCXOA*dSZvxm-*dWOUM`?%~U)? zOp#(^bH4EvzVVd}!$y4bY_4&PH`k>N>3HUB(dNq9>OeI#7HjJBHC=p7*V<^VW*~i` z5UkAy!+bEjwl5d#O`j|J8ds~c-ma{@ix@GTe0AsA;av5>v=g+7!~gNc2NzfMS$oS1 zO7G||z_~2>Ah~)lOSiw!0idV`7ytlw6yJF&*EyVXjcopucU^-{d`{@Z z;e<}ybt^xHPU?rUG=?d}{Zy?;(Vigt>Hmi5!utd%J$!KSLb?3e={k6`q)>I0_R;&b zK&6tsQW0A|8-dcTs0hD>S_QSKP=md=(q4VPZcpASC|QM?F@{P=k17cix`xq!s%wXn zAqJgo<)Z~#$&TpB9yp-XY)aS^&Tz^(Ru#`NK_6aduc)+AU)TrOIMU`rHlj*cq!%?F zSS6ETv(TWnIlyVif-f+3Yg%5(9BMI9L4AO^BqTyL@$yXHV!>#PBo?^o#n=tJtiUoP z6eQ4P^|GeYToH6vVle?@KcePKAx*S~xj#a}R)~I!&d7KLH53$$&)rNeb?#+`?#6uw zRnz~4&cI(3s7c!jzF^u?tZm5G9_MS1Z$vh|o40ed6TCT?)}#+)%tf2`;}Z`~WNobl zMM<6g_4w!GxtgQt3s`&X!Lh7uUrA+k{JQ(|?p*K{P+K-{-d4xk>awk52nY9HhV_@V5mUXWa&0yA06bY4zB-rvo}|DIqSMy z^ak?Ye%{-^UcK@5#zfA0F>Am0%pY9we)6NVwP*`uZOsM5Y2&?Zs~@b7Z=TP2C$jd5 zBJIi3%{<+_I<)rFwS|qP9DP1(J}+tl^~ymjnP`Il4w>(^tYr_vo3O%5R&^45C9ozO zC65oIWpv>0knC)bZ$%>{)y9$jzFk$LcuG>H7_ z9u}oaaX$lls1=D+ZNf|u|EC4KX;%2y;A4l613pgp(C~4UE|pZ;QPd81@QqQG3~F$M zOB%ewc~5iyOz8}l)Fc#LFUu$KpW;cW>`7U`e_FwKPPt;}JGCS&B@ZLYWXa$p*E?(p z#lU0~smH4#JNVI7$(>|TBx-qluIfV`BD6nJNVJ<;73=HA6-R$?6A-7 z#g8s!PudfTf3YGzieGaFKl=Nxs^&{yk)Mj8_mnMJG5AjAOAocST{EP3Hg|Af*fAo8 ziX0d!j))^^*mFb-DM!+gXpn^rZ(Z!-r%A5e!H;nVKgNpuR6Gc#oNz$gYle(a>r6Du zJyztWRj%E^k7)-#ri%QSDvl2gUY5Q1F{S7vooJJLtjJGTu2u7s=#-(eJ#wz}opgbJ z#+tMzZAnMcnWS%;61{S5qF>1kD7k}54t-eUNgP&kN95d1#r}E|G)l^nvZm}QTgs7g zrsx#(xl=ckuT9*&k~U0J?xeeXrI6Y(Ss}2p`695gF+T$dlwS8=X&kRsmXH_j34LF-^?vyGKa}LCO^R>0tv)177~#;bW+CAx{*BqrElU3Aal3Ww%guT zA0uQJ!(XC}G61_jI17UmiAX?VEYPmBzTk30fPy4DqZH4&kLJ5C@!glooQfOX{Lm$S z=o0wuD?1nQoc@%qUfH+RIIu+@0E7H9$ES{rp&)x89@^m;pD`3^-=C&R~FQS94KSlhGGx?^dAW3ElBD5YBc^<^tEUu4_MpfyWMTfNXUf zc|srg*56Q5|5?wcJsFdlftvb^sYnMN_wjUitNX+g`oz;fPr-Kre7{xT;(+)H_*2TK z3x*|tkL&*iNBGPH6)_)6r# zFLLtK-neR7tIOF3fob%3n=5&|QF9VQ`fnh`>!J6%!F=olBN$d$`BQQokmJ}McjD2U zmeo7lP$9QjZt92&0edTZRL3A?Ioa4$!Vf3xj<%7iI+WJ zNM(g{W71gKGt=mV*Hla z02h?0QaB&X#<~)gocmHaHb5T+IPxm|bN{6>_j}Aw$wO{V;C*cJlwuww0}hVy6MM{% z<_FG@ z)?3&xKDpF-PI8Kcz*!IX_2ThR;&vnkHwt6$q6rvN=%|Nl{@gT-(o*{l>{}eT?O0A~ zAQ@jGz8mgEMB|D-ZyJch?SFXpCe8{Wd=CIazcQqRMqY1 zvwg4UYOZH}*Pk`CTo_zBmzWLC`8~Nj7 z{PD4D^Pybxc;-UUTetE7@9kWB`-%6cnjrjY@QJEpG8ppkWkx^x;Bl0v+Y6z6`Op9# z8dyK{+wT04%lwhcxg%F|p~;Nn8QiMyw(xkFu7me>tR2T2btj&9&jI~H@DvybwE-{? z{DE)GRAYNN+rdXi9v*pg{NeGex4XplkMqYT_~R3V?MujZ!)h(>?Oyxo6YueIval1o z0}ymRo26T`=2p=qg*&JGpeU1_^glrcc2ezfADYJEQ!$FGykk~!QC5o8qLUKWJ-DEx zJp=_ET%I!V$}!6yNF80Qq!*pM1B$)i;cOgw0u_NqK3t?Cwmx@q(v%<C=RY_)xD|5_yH>;KK+{DD#a!01 z3CJ?J2cwKBzNfZ;@`^W?#qkxaH{pg|;`a1x1YY1I9*CVo{A(bz)Kp=Jcdn27IK0Dv z3&ZQ90u7Jedid7rD{H6L-pTp*r>&q8-PK|wcFmgaIL>z*&vm@I*~E7YZ@EU&2HZMo zRz~4+OV-@9TMwbM?t{3sk2HAuBdJ*ee?$uI zn=@LHD`9DV;k!rOqyCldJ&kO|Z=@avZ#~fYK+pq(UkB zhO$65Q}NLMb0}6EE^J8Ttlrhs< zK#NP`1m_qsI@(`YaXh%YfXMwjNI*9JJ?2p#aKD9Qr$~GVkfp8)BC+!~mSUZs;je9l zR;6ECbb5CG#BB>jd;c-62h5*2U7E@-*!~7;AHiGGFuf3gFRiB1L2iV43k)&x)*swm zQ^mnlF=kS0A`x_)!LkPoP6J+-72{>{7Nwzn(WA%9N0nMA#9kij_SnMLxFINXYb zmuVK~0BBL(1{VzYQuzA_kT=5Zs;OFpuK$y)-WOh6jA^v+`P*o(pSN%WJPoMA78u{-V5g zM66ZyHaRXaz5^!pu>&Tvi)%p|nUZ%}pvfqd0NgJT%{DU^iO1pM_w5CS`!TW5|L)2!HC?58u=tvV6p(8 zI1A?Nht%%^wFPrS!R*SLgK&RAm8mP3JM!i}-rTot&i9|>`%i9mbp^YGu9>8z_Q3p<yYt)IR)=T&ipF$s>b`i^x9;4Fm?*P zV>$Ejz38d?t-xPcrU$$#^rTTy^Y@*2+a9W_Egv|<2M#Sy6dHP#Co*SveQmM6bG>IX z#Rsk}PoRC#T!5>yJO4kY&9yLMRogzw=zgK44P7sFklV)Gb~Ay!VsJ|^$Zc~P06y31 z3|0vUIk-D!bQi}iztDLUFyyv7Nc&#HQ3(}t+dskfFSK=r3mOTE+3jNl>NbqXP|R+( z0Te9&(F+QWP}P4=;DvWWtMrH2?HhVR=8&OHq7Aw281(3Qp*4%Bo^8zG&-Fal8VuEl z2r$TjHb)q3XqI4*!yy2eMS($XJ3wG2L#u=bIhX*%^B5WkjO4@>i0dxgC#qQ6%);Cp zyaxg=P{uh}hG5p?pEXDCn zS}1>DAx^?pqH-qcmncr6Z;6t0V^`i%!^OnR0{Igy;$4+T*u$ro{7X!Jh1f22xC_H! z++zfL)bTD6h5IvXgaKC)hY}-FxG@mzOB6KG;T)=Y(ZK4*9G*S76-=ry!TmVK~{X|%tmFmahN2g!3x z{sC}0i!Sf7qu}-~J0ZZd>?pcCka+!B%2n_*ufD~52A1ifzbZ?Cwbqnv8RR{K%k=MR z>Q`od)sdyDiZylF#zDSj5b}j!O}73ZA3T_){DrFOY~6moYJZmU6@rlO=Y#zSuWrwF zp5UubWT`+Q*qZG)#s`l9yy&mb``dYcd*0v0`@8b~e%=rGp5FyR1%36(g>3lMZ0$)5 mm}s+<_l4D>X@3z6XxuLbY?`5O>c%XZh86lBDEuZP^#1@ov#bdK literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/python.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/python.py new file mode 100644 index 00000000..b60382e1 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/python.py @@ -0,0 +1,700 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import datetime +from collections import namedtuple +from functools import partial + +from aniso8601.builders import ( + BaseTimeBuilder, + DateTuple, + Limit, + TupleBuilder, + cast, + range_check, +) +from aniso8601.exceptions import ( + DayOutOfBoundsError, + HoursOutOfBoundsError, + MinutesOutOfBoundsError, + MonthOutOfBoundsError, + SecondsOutOfBoundsError, + WeekOutOfBoundsError, + YearOutOfBoundsError, +) +from aniso8601.utcoffset import UTCOffset + +DAYS_PER_YEAR = 365 +DAYS_PER_MONTH = 30 +DAYS_PER_WEEK = 7 + +HOURS_PER_DAY = 24 + +MINUTES_PER_HOUR = 60 +MINUTES_PER_DAY = MINUTES_PER_HOUR * HOURS_PER_DAY + +SECONDS_PER_MINUTE = 60 +SECONDS_PER_DAY = MINUTES_PER_DAY * SECONDS_PER_MINUTE + +MICROSECONDS_PER_SECOND = int(1e6) + +MICROSECONDS_PER_MINUTE = 60 * MICROSECONDS_PER_SECOND +MICROSECONDS_PER_HOUR = 60 * MICROSECONDS_PER_MINUTE +MICROSECONDS_PER_DAY = 24 * MICROSECONDS_PER_HOUR +MICROSECONDS_PER_WEEK = 7 * MICROSECONDS_PER_DAY +MICROSECONDS_PER_MONTH = DAYS_PER_MONTH * MICROSECONDS_PER_DAY +MICROSECONDS_PER_YEAR = DAYS_PER_YEAR * MICROSECONDS_PER_DAY + +TIMEDELTA_MAX_DAYS = datetime.timedelta.max.days + +FractionalComponent = namedtuple( + "FractionalComponent", ["principal", "microsecondremainder"] +) + + +def year_range_check(valuestr, limit): + YYYYstr = valuestr + + # Truncated dates, like '19', refer to 1900-1999 inclusive, + # we simply parse to 1900 + if len(valuestr) < 4: + # Shift 0s in from the left to form complete year + YYYYstr = valuestr.ljust(4, "0") + + return range_check(YYYYstr, limit) + + +def fractional_range_check(conversion, valuestr, limit): + if valuestr is None: + return None + + if "." in valuestr: + castfunc = partial(_cast_to_fractional_component, conversion) + else: + castfunc = int + + value = cast(valuestr, castfunc, thrownmessage=limit.casterrorstring) + + if isinstance(value, FractionalComponent): + tocheck = float(valuestr) + else: + tocheck = int(valuestr) + + if limit.min is not None and tocheck < limit.min: + raise limit.rangeexception(limit.rangeerrorstring) + + if limit.max is not None and tocheck > limit.max: + raise limit.rangeexception(limit.rangeerrorstring) + + return value + + +def _cast_to_fractional_component(conversion, floatstr): + # Splits a string with a decimal point into an int, and + # int representing the floating point remainder as a number + # of microseconds, determined by multiplying by conversion + intpart, floatpart = floatstr.split(".") + + intvalue = int(intpart) + preconvertedvalue = int(floatpart) + + convertedvalue = (preconvertedvalue * conversion) // (10 ** len(floatpart)) + + return FractionalComponent(intvalue, convertedvalue) + + +class PythonTimeBuilder(BaseTimeBuilder): + # 0000 (1 BC) is not representable as a Python date + DATE_YYYY_LIMIT = Limit( + "Invalid year string.", + datetime.MINYEAR, + datetime.MAXYEAR, + YearOutOfBoundsError, + "Year must be between {0}..{1}.".format(datetime.MINYEAR, datetime.MAXYEAR), + year_range_check, + ) + TIME_HH_LIMIT = Limit( + "Invalid hour string.", + 0, + 24, + HoursOutOfBoundsError, + "Hour must be between 0..24 with 24 representing midnight.", + partial(fractional_range_check, MICROSECONDS_PER_HOUR), + ) + TIME_MM_LIMIT = Limit( + "Invalid minute string.", + 0, + 59, + MinutesOutOfBoundsError, + "Minute must be between 0..59.", + partial(fractional_range_check, MICROSECONDS_PER_MINUTE), + ) + TIME_SS_LIMIT = Limit( + "Invalid second string.", + 0, + 60, + SecondsOutOfBoundsError, + "Second must be between 0..60 with 60 representing a leap second.", + partial(fractional_range_check, MICROSECONDS_PER_SECOND), + ) + DURATION_PNY_LIMIT = Limit( + "Invalid year duration string.", + None, + None, + YearOutOfBoundsError, + None, + partial(fractional_range_check, MICROSECONDS_PER_YEAR), + ) + DURATION_PNM_LIMIT = Limit( + "Invalid month duration string.", + None, + None, + MonthOutOfBoundsError, + None, + partial(fractional_range_check, MICROSECONDS_PER_MONTH), + ) + DURATION_PNW_LIMIT = Limit( + "Invalid week duration string.", + None, + None, + WeekOutOfBoundsError, + None, + partial(fractional_range_check, MICROSECONDS_PER_WEEK), + ) + DURATION_PND_LIMIT = Limit( + "Invalid day duration string.", + None, + None, + DayOutOfBoundsError, + None, + partial(fractional_range_check, MICROSECONDS_PER_DAY), + ) + DURATION_TNH_LIMIT = Limit( + "Invalid hour duration string.", + None, + None, + HoursOutOfBoundsError, + None, + partial(fractional_range_check, MICROSECONDS_PER_HOUR), + ) + DURATION_TNM_LIMIT = Limit( + "Invalid minute duration string.", + None, + None, + MinutesOutOfBoundsError, + None, + partial(fractional_range_check, MICROSECONDS_PER_MINUTE), + ) + DURATION_TNS_LIMIT = Limit( + "Invalid second duration string.", + None, + None, + SecondsOutOfBoundsError, + None, + partial(fractional_range_check, MICROSECONDS_PER_SECOND), + ) + + DATE_RANGE_DICT = BaseTimeBuilder.DATE_RANGE_DICT + DATE_RANGE_DICT["YYYY"] = DATE_YYYY_LIMIT + + TIME_RANGE_DICT = {"hh": TIME_HH_LIMIT, "mm": TIME_MM_LIMIT, "ss": TIME_SS_LIMIT} + + DURATION_RANGE_DICT = { + "PnY": DURATION_PNY_LIMIT, + "PnM": DURATION_PNM_LIMIT, + "PnW": DURATION_PNW_LIMIT, + "PnD": DURATION_PND_LIMIT, + "TnH": DURATION_TNH_LIMIT, + "TnM": DURATION_TNM_LIMIT, + "TnS": DURATION_TNS_LIMIT, + } + + @classmethod + def build_date(cls, YYYY=None, MM=None, DD=None, Www=None, D=None, DDD=None): + YYYY, MM, DD, Www, D, DDD = cls.range_check_date(YYYY, MM, DD, Www, D, DDD) + + if MM is None: + MM = 1 + + if DD is None: + DD = 1 + + if DDD is not None: + return PythonTimeBuilder._build_ordinal_date(YYYY, DDD) + + if Www is not None: + return PythonTimeBuilder._build_week_date(YYYY, Www, isoday=D) + + return datetime.date(YYYY, MM, DD) + + @classmethod + def build_time(cls, hh=None, mm=None, ss=None, tz=None): + # Builds a time from the given parts, handling fractional arguments + # where necessary + hours = 0 + minutes = 0 + seconds = 0 + microseconds = 0 + + hh, mm, ss, tz = cls.range_check_time(hh, mm, ss, tz) + + if isinstance(hh, FractionalComponent): + hours = hh.principal + microseconds = hh.microsecondremainder + elif hh is not None: + hours = hh + + if isinstance(mm, FractionalComponent): + minutes = mm.principal + microseconds = mm.microsecondremainder + elif mm is not None: + minutes = mm + + if isinstance(ss, FractionalComponent): + seconds = ss.principal + microseconds = ss.microsecondremainder + elif ss is not None: + seconds = ss + + ( + hours, + minutes, + seconds, + microseconds, + ) = PythonTimeBuilder._distribute_microseconds( + microseconds, + (hours, minutes, seconds), + (MICROSECONDS_PER_HOUR, MICROSECONDS_PER_MINUTE, MICROSECONDS_PER_SECOND), + ) + + # Move midnight into range + if hours == 24: + hours = 0 + + # Datetimes don't handle fractional components, so we use a timedelta + if tz is not None: + return ( + datetime.datetime( + 1, 1, 1, hour=hours, minute=minutes, tzinfo=cls._build_object(tz) + ) + + datetime.timedelta(seconds=seconds, microseconds=microseconds) + ).timetz() + + return ( + datetime.datetime(1, 1, 1, hour=hours, minute=minutes) + + datetime.timedelta(seconds=seconds, microseconds=microseconds) + ).time() + + @classmethod + def build_datetime(cls, date, time): + return datetime.datetime.combine( + cls._build_object(date), cls._build_object(time) + ) + + @classmethod + def build_duration( + cls, PnY=None, PnM=None, PnW=None, PnD=None, TnH=None, TnM=None, TnS=None + ): + # PnY and PnM will be distributed to PnD, microsecond remainder to TnS + PnY, PnM, PnW, PnD, TnH, TnM, TnS = cls.range_check_duration( + PnY, PnM, PnW, PnD, TnH, TnM, TnS + ) + + seconds = TnS.principal + microseconds = TnS.microsecondremainder + + return datetime.timedelta( + days=PnD, + seconds=seconds, + microseconds=microseconds, + minutes=TnM, + hours=TnH, + weeks=PnW, + ) + + @classmethod + def build_interval(cls, start=None, end=None, duration=None): + start, end, duration = cls.range_check_interval(start, end, duration) + + if start is not None and end is not None: + # / + startobject = cls._build_object(start) + endobject = cls._build_object(end) + + return (startobject, endobject) + + durationobject = cls._build_object(duration) + + # Determine if datetime promotion is required + datetimerequired = ( + duration.TnH is not None + or duration.TnM is not None + or duration.TnS is not None + or durationobject.seconds != 0 + or durationobject.microseconds != 0 + ) + + if end is not None: + # / + endobject = cls._build_object(end) + + # Range check + if isinstance(end, DateTuple) and datetimerequired is True: + # is a date, and requires datetime resolution + return ( + endobject, + cls.build_datetime(end, TupleBuilder.build_time()) - durationobject, + ) + + return (endobject, endobject - durationobject) + + # / + startobject = cls._build_object(start) + + # Range check + if isinstance(start, DateTuple) and datetimerequired is True: + # is a date, and requires datetime resolution + return ( + startobject, + cls.build_datetime(start, TupleBuilder.build_time()) + durationobject, + ) + + return (startobject, startobject + durationobject) + + @classmethod + def build_repeating_interval(cls, R=None, Rnn=None, interval=None): + startobject = None + endobject = None + + R, Rnn, interval = cls.range_check_repeating_interval(R, Rnn, interval) + + if interval.start is not None: + startobject = cls._build_object(interval.start) + + if interval.end is not None: + endobject = cls._build_object(interval.end) + + if interval.duration is not None: + durationobject = cls._build_object(interval.duration) + else: + durationobject = endobject - startobject + + if R is True: + if startobject is not None: + return cls._date_generator_unbounded(startobject, durationobject) + + return cls._date_generator_unbounded(endobject, -durationobject) + + iterations = int(Rnn) + + if startobject is not None: + return cls._date_generator(startobject, durationobject, iterations) + + return cls._date_generator(endobject, -durationobject, iterations) + + @classmethod + def build_timezone(cls, negative=None, Z=None, hh=None, mm=None, name=""): + negative, Z, hh, mm, name = cls.range_check_timezone(negative, Z, hh, mm, name) + + if Z is True: + # Z -> UTC + return UTCOffset(name="UTC", minutes=0) + + tzhour = int(hh) + + if mm is not None: + tzminute = int(mm) + else: + tzminute = 0 + + if negative is True: + return UTCOffset(name=name, minutes=-(tzhour * 60 + tzminute)) + + return UTCOffset(name=name, minutes=tzhour * 60 + tzminute) + + @classmethod + def range_check_duration( + cls, + PnY=None, + PnM=None, + PnW=None, + PnD=None, + TnH=None, + TnM=None, + TnS=None, + rangedict=None, + ): + years = 0 + months = 0 + days = 0 + weeks = 0 + hours = 0 + minutes = 0 + seconds = 0 + microseconds = 0 + + PnY, PnM, PnW, PnD, TnH, TnM, TnS = BaseTimeBuilder.range_check_duration( + PnY, PnM, PnW, PnD, TnH, TnM, TnS, rangedict=cls.DURATION_RANGE_DICT + ) + + if PnY is not None: + if isinstance(PnY, FractionalComponent): + years = PnY.principal + microseconds = PnY.microsecondremainder + else: + years = PnY + + if years * DAYS_PER_YEAR > TIMEDELTA_MAX_DAYS: + raise YearOutOfBoundsError("Duration exceeds maximum timedelta size.") + + if PnM is not None: + if isinstance(PnM, FractionalComponent): + months = PnM.principal + microseconds = PnM.microsecondremainder + else: + months = PnM + + if months * DAYS_PER_MONTH > TIMEDELTA_MAX_DAYS: + raise MonthOutOfBoundsError("Duration exceeds maximum timedelta size.") + + if PnW is not None: + if isinstance(PnW, FractionalComponent): + weeks = PnW.principal + microseconds = PnW.microsecondremainder + else: + weeks = PnW + + if weeks * DAYS_PER_WEEK > TIMEDELTA_MAX_DAYS: + raise WeekOutOfBoundsError("Duration exceeds maximum timedelta size.") + + if PnD is not None: + if isinstance(PnD, FractionalComponent): + days = PnD.principal + microseconds = PnD.microsecondremainder + else: + days = PnD + + if days > TIMEDELTA_MAX_DAYS: + raise DayOutOfBoundsError("Duration exceeds maximum timedelta size.") + + if TnH is not None: + if isinstance(TnH, FractionalComponent): + hours = TnH.principal + microseconds = TnH.microsecondremainder + else: + hours = TnH + + if hours // HOURS_PER_DAY > TIMEDELTA_MAX_DAYS: + raise HoursOutOfBoundsError("Duration exceeds maximum timedelta size.") + + if TnM is not None: + if isinstance(TnM, FractionalComponent): + minutes = TnM.principal + microseconds = TnM.microsecondremainder + else: + minutes = TnM + + if minutes // MINUTES_PER_DAY > TIMEDELTA_MAX_DAYS: + raise MinutesOutOfBoundsError( + "Duration exceeds maximum timedelta size." + ) + + if TnS is not None: + if isinstance(TnS, FractionalComponent): + seconds = TnS.principal + microseconds = TnS.microsecondremainder + else: + seconds = TnS + + if seconds // SECONDS_PER_DAY > TIMEDELTA_MAX_DAYS: + raise SecondsOutOfBoundsError( + "Duration exceeds maximum timedelta size." + ) + + ( + years, + months, + weeks, + days, + hours, + minutes, + seconds, + microseconds, + ) = PythonTimeBuilder._distribute_microseconds( + microseconds, + (years, months, weeks, days, hours, minutes, seconds), + ( + MICROSECONDS_PER_YEAR, + MICROSECONDS_PER_MONTH, + MICROSECONDS_PER_WEEK, + MICROSECONDS_PER_DAY, + MICROSECONDS_PER_HOUR, + MICROSECONDS_PER_MINUTE, + MICROSECONDS_PER_SECOND, + ), + ) + + # Note that weeks can be handled without conversion to days + totaldays = years * DAYS_PER_YEAR + months * DAYS_PER_MONTH + days + + # Check against timedelta limits + if ( + totaldays + + weeks * DAYS_PER_WEEK + + hours // HOURS_PER_DAY + + minutes // MINUTES_PER_DAY + + seconds // SECONDS_PER_DAY + > TIMEDELTA_MAX_DAYS + ): + raise DayOutOfBoundsError("Duration exceeds maximum timedelta size.") + + return ( + None, + None, + weeks, + totaldays, + hours, + minutes, + FractionalComponent(seconds, microseconds), + ) + + @classmethod + def range_check_interval(cls, start=None, end=None, duration=None): + # Handles concise format, range checks any potential durations + if start is not None and end is not None: + # / + # Handle concise format + if cls._is_interval_end_concise(end) is True: + end = cls._combine_concise_interval_tuples(start, end) + + return (start, end, duration) + + durationobject = cls._build_object(duration) + + if end is not None: + # / + endobject = cls._build_object(end) + + # Range check + if isinstance(end, DateTuple): + enddatetime = cls.build_datetime(end, TupleBuilder.build_time()) + + if enddatetime - datetime.datetime.min < durationobject: + raise YearOutOfBoundsError("Interval end less than minimium date.") + else: + mindatetime = datetime.datetime.min + + if end.time.tz is not None: + mindatetime = mindatetime.replace(tzinfo=endobject.tzinfo) + + if endobject - mindatetime < durationobject: + raise YearOutOfBoundsError("Interval end less than minimium date.") + else: + # / + startobject = cls._build_object(start) + + # Range check + if type(start) is DateTuple: + startdatetime = cls.build_datetime(start, TupleBuilder.build_time()) + + if datetime.datetime.max - startdatetime < durationobject: + raise YearOutOfBoundsError( + "Interval end greater than maximum date." + ) + else: + maxdatetime = datetime.datetime.max + + if start.time.tz is not None: + maxdatetime = maxdatetime.replace(tzinfo=startobject.tzinfo) + + if maxdatetime - startobject < durationobject: + raise YearOutOfBoundsError( + "Interval end greater than maximum date." + ) + + return (start, end, duration) + + @staticmethod + def _build_week_date(isoyear, isoweek, isoday=None): + if isoday is None: + return PythonTimeBuilder._iso_year_start(isoyear) + datetime.timedelta( + weeks=isoweek - 1 + ) + + return PythonTimeBuilder._iso_year_start(isoyear) + datetime.timedelta( + weeks=isoweek - 1, days=isoday - 1 + ) + + @staticmethod + def _build_ordinal_date(isoyear, isoday): + # Day of year to a date + # https://stackoverflow.com/questions/2427555/python-question-year-and-day-of-year-to-date + builtdate = datetime.date(isoyear, 1, 1) + datetime.timedelta(days=isoday - 1) + + return builtdate + + @staticmethod + def _iso_year_start(isoyear): + # Given an ISO year, returns the equivalent of the start of the year + # on the Gregorian calendar (which is used by Python) + # Stolen from: + # http://stackoverflow.com/questions/304256/whats-the-best-way-to-find-the-inverse-of-datetime-isocalendar + + # Determine the location of the 4th of January, the first week of + # the ISO year is the week containing the 4th of January + # http://en.wikipedia.org/wiki/ISO_week_date + fourth_jan = datetime.date(isoyear, 1, 4) + + # Note the conversion from ISO day (1 - 7) and Python day (0 - 6) + delta = datetime.timedelta(days=fourth_jan.isoweekday() - 1) + + # Return the start of the year + return fourth_jan - delta + + @staticmethod + def _date_generator(startdate, timedelta, iterations): + currentdate = startdate + currentiteration = 0 + + while currentiteration < iterations: + yield currentdate + + # Update the values + currentdate += timedelta + currentiteration += 1 + + @staticmethod + def _date_generator_unbounded(startdate, timedelta): + currentdate = startdate + + while True: + yield currentdate + + # Update the value + currentdate += timedelta + + @staticmethod + def _distribute_microseconds(todistribute, recipients, reductions): + # Given a number of microseconds as int, a tuple of ints length n + # to distribute to, and a tuple of ints length n to divide todistribute + # by (from largest to smallest), returns a tuple of length n + 1, with + # todistribute divided across recipients using the reductions, with + # the final remainder returned as the final tuple member + results = [] + + remainder = todistribute + + for index, reduction in enumerate(reductions): + additional, remainder = divmod(remainder, reduction) + + results.append(recipients[index] + additional) + + # Always return the remaining microseconds + results.append(remainder) + + return tuple(results) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__init__.py new file mode 100644 index 00000000..5cfededc --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e42831ec3edc70d84f798af772dfdf99345aa6f8 GIT binary patch literal 208 zcmX@j%ge<81m4Ck(=P()#~=SU)v8 zF|RlyD>E-8F-PCiGsIWl*U`mLzpym3DmSsXB(+GtEH$r8KPNLuzo4=tBR|hr&(KJ} zII|>Gw;(Y&J25@ASU)i@vpC-ietdjpUS>&ryk0@&FAkgB c{FKt1RJ$Tpp#6+MTnu7-WM*V!EMf+-0K{!L?f?J) literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/test_init.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/test_init.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd97e417ac0608e5acaeed193586ac90aa8a9215 GIT binary patch literal 30992 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/test_python.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/__pycache__/test_python.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5679f4fab9bd1d6ecccc2a23947b991fd5f2cb5f GIT binary patch literal 48218 zcmeHwTX0)RcG$&>cn}~#5+nfH6*GpGYJ3s)1G$N-a_NEf%i+W6y zuu^f(>BfEF;)1xKq}{DluB6sQ-*dW8cc0UJ`t<4Ue`~W@7AfztF7-E zHyrd&j3<5`91r@qw}(gRPs0)am_Had4+y9>e4U&ar|1oac+oy?_#!4SJlYG{!I$x1 zyx{na;AKb?VE0_}kFq{4UNLlWI1n5PP7I9*2t!C9#VC=)a>L`7d_xy6`!2p2x8Lv$ zb3>At21~rCZ}`TsYr$h9dnT@pvw^)FH^Ie=4@_L+0x8jX2TvW_H^Ge!2Ps(o5#R7z zr+gPD##tIsbkxs|`!8J%N)szR>L0%r^ra?Od~{+wcsV7PQkr5ayyL9T_ht&X;~W%9 z9t#a-K0VNTY-A+h3tkl2fMGO=A5Sacc4V-S461ch&`hSjpVpcbOZ!|GY)lN|bf zOLLRC!i!qsJN_3m@;_L^P0c3>TsDV)(=ZwFj1oLk7I_}k5+ z{tL}-5!q^M^0YPw{6SyiTf-OM9KPfWG!Kva0~4JcEuQ8JROkZDz{5cr4pFqGw{FCX zF?I+^kqXviw<^YIQbcZq(gZF;@GkSn;aarTEL!dG_mQ<~(YhI4p4yDXmfPm#LdI-c zFgYV8XUx?wT{mlvy0(S-Vy2!&lU0nbpKXY`wuji5saG-np{e&Nq>RvFpYz#=2_nA)r`O(JH{jAg}#HH-OYm6|21)N*NV(opOIK1p;A?a(br zMV-wR^C06KjIBvDt}RvTYN_5}Y8ej`(7dD7Fz0|C4Rfdcy6znFjz%7TgQ4*aw*JX{ zz9UHV0ZV@m&k`1E(tT!l^qMcF6KI59z|*vZ8b@5?SKoy8MdyJ) z4}hMA9MToUEhH^6$Z)lQ$>m{ywGg+`4&vmnKi~^AXt_F!G)Vget{$VxiL5D)jFUZC zh^ulE-H=BBst$$LUc6|nxXVp>?q3PF9uJ>9^HirTu-rB*nAUSjWNn>iHAVj$_YsTC-(2M@X4My*+&` zYHg2gJv84se>J-G1cfp&d4&tM%80G<-elCa=`o`*w+pGptlsB3h=8R1Ncj^{>%$5d9H=kSp$0VmYO4_otky}HjT^7VHdJR63QJy-o+}gOW0)WQUO~{d&}$GnH9E6)?#H@VV5Ukk62-frs-qOLq~f{ zD-J$a5)-&2E^qcTH?^!A=P&m)zpc5YgMm%ZJ4MKwI)Kt6lsG)x@#q=0f>2sX!pyw2 z4(hmyZz0w_qGPKGW{pbxTEMSM!e5^iem&GwUJ^ddUoHI`ApeaD_%$qYOXl*Y($DAL zpb8)9-z4O}8S0NOzq^W9iQ^d7M5&a;^SZz>Dj^!r=cYypah8(ugUyw=Kmm<#L3@xGu=ev$TkD6^S@c z%TgSF|1}0UqQ^B`mvHD>LYa?iI{Xju3l4MKb_h^+U=yanxE|j)BrR&-LCI;eW;XR(i`2yEQg8?jk6+Bc~%SV7AG090~6BV^Ah+toZ zL;~M{q~2v<7E)2WSXPOD%hxTsDj2K!5rH0pZ$DJ@}3@98qr$~tFUyy^pGw6bMvxe81p z>jovYGKt=GY!xV;YI3b%YuUOa+(J;f>Q&$>l~%)U$k?76XBv1@E0l5ryGcdOrs8Z; zL18l1W^tmxqB6J%{xp7)uv}%LT4E4xWH-(<@jN`!EGY|VF@;=O_*_`eJ$(i~NVKLT zzm}x@TKTl76v%R02W4vGAy}^(u9M`{#}O!CA!6ngc2?EXx6lJRCAdms}udvNBEL_QC*M>1hZ(m%`|%>>Q%v&UwR z^L@dHcBCxHFd>*3t`L_FI(qRTdx97yHYOP+&@wE0h+!g6Hq8UW1WfZz_Q$oCFHgd{ zZBsjU0`Qh_3Wsa5m%(Kqo-;<)`X}>R+sINcF86kIZCxrwNL(UW+O;R2fr-yGc<0`R zAf6K-4g~SsG5#n-!fHtqQ3O&RBj<{DBJfdg%WJo)o6SE(qh!)1_p4u6)xAFk;lmVc8s&1N% z*xPszl19wlElI&U{k4d_n+H%x!#$M@;+Z}%%gwzVv-c;Zax-Gzo-P#=lV9{+-|g4$ zb$)lphdZW+W92Pjt7p;SoYF^Z>+fIx_|`|aLe;Si+r!o!BzC$lV)Oi<^G|ksf5+T# ztnEP9dJrn|_ijy{p6;8i3+Y3?XlY;AzBiHK{d2Q>=RC3Xdt>%}lqf3$W(~A&tbbIt zVcIYqoE->x=bX{9Lyye{FmqTFW{yQy`C>U(KPnch>K~QYO>YeK#L9O*%gre$T+Yvf z=BZ)I(Mlps#Styr_t>b1R4hU&WmBy){?NdDYpkgs)>#4DW(I60!LCJY{WJ?Jx^;8< zXxZKr>?9iMLb_P_c1nZI2B}mj7N#^>c5wB=Yyc*d7iNvM(iNagiE)C?TxE4;ju6;Xy2O%TRTu_`@^={`>%a`{-g7utFiSxVe1}@ zJsh@G-QW0e<429(YYxMVHYsZMDsW{Da^tQ(!mc+z4tEfL;Nz7v*W#M6QmTP9|LY8eN?-Q7P<1-?eXP~;YWh6ODGjBAJDo4A2b&VD?UN#FSgP5fp_cupfeVnP)J* zR^A<%ViN-g8+G(Pa#VnMyKj2)Y%uEB4g&^sI|cdPH7m^v|i6$fhC zo9CKrdCyALn$$_u2j)96Cbj5vlfSi(oa?82(*v{KkRxOAn&Y$z^SHkg3WLMfq( zj$-_qGKi7xy1)#>P_Y9BkPRD&HE%#8v(>goirZ&z%oTk9X1KUd*-)FNe?qN_^iOlV z3jp}F!Xg&-KE{lT_=!Ge#wtoG+VK)8*i@&Gr;tK^M(cxV#x9wiVZH@yW~{;_EG(&w zEy|b|_N{p{4v9@e1EnlhfywufWs*9=T+3D9VyGBi{o9W`hdMO^TSCRbZAVVs2p@Gg8}>pjBEo&1_3XJdcEDn%UNj z@NF|*2}V2Hkr6|hLp!@QBYY=Vr@Q!33TnKP)nvrkmc+%CYZlp%7z>2P;sU1^>r))QvYW^5rxIe)l1Oa$v{ssIuscYk*<|h&APZ8kH zF!)yxK*YbscTAc4HyEHwsH6je0Vx?WZk3qW0#p?g)jlL@eRwcQs_xRNUR20-tXbtH!vV2 zzmIRIWpcldLBfJW^2SQx{s4oIF+jBz3`V48@cYsjv=VxhCu-jPjolnd1NRT{BQjT_ zMb__5y!_8y#5tvn`y&KHMVOesxO@19>bU>!VKzmKpOgBQc0OUIWOv+5ZD45RLX{g> zscX_K*aV?L!~zNp%I(K={}~2E!+#gweg}j1F!)snz(&^rWg?YMDv%h#a;Oo^j7l%- z8x0P}bz{TVsS%9VwG;c%s1NWMBqcM1CF$A;;7Jv_b^^2-nj}yJwL!c}-0K#>UXu8W z@1oblg1shUubI}(dO{cGt7G;fyeEVlN8$;Qgj0(qC*qA#!j!nCil$EyBhf5t`~FD#{`u3f_ETZ&z!zW*>zgf(*tdd(Adzsv?4CJY z%-+XavRv+|-q~Dg$r3<%LR|RxnV9{o1gdYgJYwG=B(zvoK6P@oaIT)J_yz+g-43R( zH0*2++gk*%>70;ZeqYRficbk45;hB(9jNkPA>?4Tuuqay9!YAgfMruPU~{bD=O2VP znqp(v-XsvWSmvI(Fk3U1n5GagE0gbdZzzm5x`hp0kqup;>L|6+q&bMFpYdzQbZ`#N<2*)6wg;iNHAyf9V(Gu zMhtYV&SfPSBf9rB8Onk~4lRosN^x;R_E4+cjNnc#p;8$ds1%`P6vFyA*zl5TTci+d zd*Yuob*Yr61Lnt)JS7w=>2Sqhg)_6IGfuu$Wi+~oS4uh>c?wCZXF(%+u#}4Rl7U8q zMvs>lqmlT?ykZ(_VE&K(HS76&NNs`=L>~!v)NA2%=g>9(E(l z>JfGmFCBbqDas&imCYpW1V5>e!7acyxol%lu$RJ|qIsr;&tb;H=bfRoXgapc>Bu;( zmGm#kH6ltw8!1068N=7EtW-+U;3a*8lDsNOLoUcdJKIeD}7Im5(rJXEz;=BY(1zKMzr8_cGx^q=N#Rj#7s0fj&sNpLlUfW#y8|yjlwPyg~|TT~>n42tBHjdu~zYS0AhS zR>%MMW>J^fjny(}SzW59aNjGX&;s_*Ua-6!kkzHqDEM;pP1HVc?Um=@gRey2g!KfF z(QZ*gmDRseS)`*vg36?RA(>JoX(O7k;;5hujjJBQXeXmE6Nel^+UTD&b*Yr6j4LJD zfikp(J)D-pwP>4}>o9w5vlLpoIc-a;qcU0Fd^J>>*(1P}zl{23a(R_>t(U8BR%Wel z9$j@DSJpR^OQpo$FeA-Ei|dEkmyPt7z2I4zZtPi$zL}ZQY_&Kud;End6?C|?y|q%E zW=p9JR!``7zVr@@3 z$@=Cip)~FIqLxCbzWGWhOw2MYX=OgsSS^gy5`8l>rRm3NrB;_gXQ@qy6pH%hE1{6o zWjCzJC-1HH)JUZjnI3Hz@JMp z?ON>p-+<9DeGgF1US5StrJf#Zwo&9l6+BC5RMA%{XeyGv3blW~LX9hNr;}cxD{Eu=HzMO~1o*DE2A&Mo{*!W5k!UImwq3_uv=j zz#g02WRFfb&`KGezyW-BGW;Fb%L#j$$NR-SFOvN>zYF;i*HGB3tMiSsaJm!kPA6`J z5jNmFFvRtE3Uu5shNqgxb>Idn*{bWq#6}=^pyL+seG!AdhJYNK)k%H-h{xePL@xa; znC<;vK(Ivi)8I~Pa34&@r2C5T)GaUFse`+8{r?G&=tdy)yX1a=!N0^{4uYj34B8>^ zSAArJ<3p8_B>S?(Ew@NuJM3NdwCx*+YX-Rkh^>WTi~CD><9-hV@B^g#fxypGfk?7H znVhrL!hMG5VI&gWFv)RWUEGf_^2b=_AK@1`_>6jTE}2&Y5O!oU+_@QAF}WM~a|nZP zU~mcoaJl^N_#VUHGzMfV6#9X}xx`Avd>eu8LV(n^wh*sQ|IZ+KLVYLqE`EO_@x5iM ze*r&f@$fOv)+H1Uc=e`84QqWewX52r;XiJN*S6b#IO3xt6<-i-0 zk?h1mWteWqx`J=m+etP{C;UYHiHizU`HAwtD*Qxw&_4kF2y8DVexlm*mJ-V|aG+~= zL%De+Y7s)f^!4&-tdXj(W*0# zahLA1JYhf7R1jQCtLLhTza4Ru!|hy2vDBkZN3wS_?)6h=5}T|b*=YHpM^%jq*$Df? z$o_5b^wrtnn7tD+Ncz2OGlEB*izK~8G3iBT#ogf4z_fSPF&hjGz=6=!C65i#-N>-h zT1cF3MoUm%6SMDKF2Ehd4J3oz8pRy=Eyi;fg*uWG&&_f%`!;Fqw1!&e_QdS_X#sYS z^pC4a|4g*%?BfjS`{Z`s&J$AvwYadwrtCX;vChG{N956lzCy%T}A&s zayLw`r!_a%7Ip83Epe{0rv?+SMu>}^L%?TR4^N#tTsy1G9l}%Mo7tU6Pdgg}1rxOmE z1$f%on^aQZ7%nAVg}s8|%2v9o9LudTH=#w!7R#YU+>2G!v_%REAj@7V9aqw3d6x~> zb>c?$?6QQK2PRO=@)FImU!Sg&xLY&4Y3EDK^01!p9rToGDwb>ztqZs8oeR#Z6IBVT zE0%JCW_iZ2dX~@?PRyxe9NIa=?AvMAaLPc+1b2w6S|-R~e2&eQSHxoyB)oEo=GYHC zxk6V8>`7~p^zMgMRREmf$@qGUW^r6i7Fmu@Ahd802=s&LE3H3eIZifxRok^P2G4*XaHhqCQ=vnH{lZEDal4 z)A)4IMoRP5mzMzuTe{Mmr7@1<)?f!pRy>Vtjsm)MzA!Dlo1)~xwr^;Yoowh(&0ol z!%~=s(TQV)1Q3rYU+$^{<~vV|HfmRH4q>J}=Z%&h$f`N~c2a3K*P1fwM8HS_V-X#R zC@?o@%0~*)HAk{&QXyW?Yh}^$?Fzy|X7KYcuczAs6IKr~mWs^50#c?6S>;S7x z+^i-!JAF!se`syTgVQ@w4~okJV=gX&Jv{@91b7#dc+j)N^?)9&l(am~GLl6n@`WxG z!-5f5r19a80b+CRX>V!7?X{AnFf=909<~yea5Q)j2Y>v{EiEj{2%88+a9E5n;$n=r zczFfQ-m)jL)isx=hTjNCu2EA?)v7X8+e|j8lEZLS(3-E5Dr*91yLn6%MCQENR}__>=z)cUi(x zA6qQ8!%J)hrS?>ixnRcjgqBMzY5yFhPG$XzHJPquS-IpXrA!?~lUi0x`Tw_%La(S) ziwg1~*5WH{pK?)tej)vsn~X)cAWj~|BhG~p=$1aKUh8=JUMpC^=Xg`kk86_NNM#GX za1VA8dN4@~NJbBZ-X@C?{#DlM`IlO&wD&N=6)Rbc3o{jbn~_lgn(~U^hQhZij1-Ai zQI75m5$BL~{oKERZ*mWjMu>w`?{z1~$Kxh`nVY&n$ecssh`kvDbpN2ouKpFieFp>d zGoZd7P*n^^d`|v3zWo*k#OZ*zj{FDs`9Lck=rsVDYff_i3!y&6fE)>x&!PH8SO0P0 zKdvA3!^O;2e09>}S2^EXzTqHT*FGdrU5hw=46a~690*XzI2?`Q25xx#l8^f-zU#+* z*Ms2VQAd6ZbC&{fW8#*wxEU`vgDcm4*W>v#?viiZ#|;N3xBw2~c!gQw4zmi$39qU2 zOtxh_>opbWFk}(<97unc`J$)-SNmy4}Yzj)sZv79Z~zf zr$)Ui@3FyXx7^ml4QNHBvC@qTr9Bb+dvLA~f@tBP+r}^WJJs)&P8EDumN+z8Ki4x4 zXOAC^nfitMY}X6`rwTcoKsqH952{r@x)wYpqKKq@TIgeb@b=dun*PFzVX!gfW=&ZXXn;AdB|WyJk4FOFC^9T`U$0%kN!Y zsBDQ;w!ned)v?OHNMYY&ou*)~=1YSf=7Ks%4et1Il#;fnP+uBVkZ^K-LGjZf3l`Hx zis?>UOrhl#twrzk{Q9ALrUhq1#Mv+%40*s|q&hrsI_AWM_oQpIRRCN5A1_@Y%F)Ya z#_}x-WqlF+dt@#M!R>tT1uCmrg%Kaw;TW>09V8k~ZcFj%QOk&=Fl+4;)DUe+Ww{sPRT>ym0qH&Gtyib`YN89sjkkAwRZxquml|BUyN>ETwggcm8BGomABzmwrKP}7pKpeF>P$|j4+X9 z9SMqyU^<#5F3?<>pc&4&&v;I>w1%Atipx~sN$a;PL2Y?>FdvNdOzHpx-aM`F28mwA)QCPw@7W=` zU(&gvbuusiOrk`{qTvbJ>V`39LQWs(`7P zcFYdUbw=z*9>LuJ1+|fa+Ue?80UX1*B~wzZF?&-c7&v=0X5T7>Qp|AnWUQbwZ10o; z0`(z7B(aJ4xvuk*UX=>S4OQtY}r57Pmlc|Xnz`3H00+3(RMQq}4)7uAh z=G_`KM)8G;#t7US%0?^NX3vGLe*g6tT+AZgB#XB!O?#siEwc@wp6_pYXx)Vd^4*%$ z!4fAyFibK}k?lWVK;RRd0mKPUFkv->t|9TYozX}ve=?AMlx{ z509xLAGlaSyihbXryEQy<6#1tceEPj98e9G&Ry4a=a_di^7tDJjc>?->qYQpF6cLU zfE+rr9e_9Jw@Ac3d^d2d_z^ogBKq8$_=YxmZYu-C%vsL%$ zW$n-QLVsDR^XVI%T0Iz#*Ch~|E9L{%j8_vFq0$lDsGK}!7U*JWMxH( zch@8%P^OOVu`Npi)DOP@qs`oJK< zKD73t!1QUr6p<=jJ4E5?n>_>fIV0>2MbK_3=)gnkHU#Zf1oeub`yN``5YUT4>U~~B zD1p~L&C2r}%nIIjkk@W}?Iy1jcqPybrTn(5w?y};)!AF4`=Q3!+obzpM``ai-Df3+ z-gU;$Y7D)bjh{6cdbb)s+h*v~B?~v|d}OH5LpS|0gI|61_r6gn6p!lAsuo=NDL##A(_{xl?e%72MAr_t<)ooJtOVB2?B)OzK)}->-vM!JN zm#jRrRC!6I%1>Xam(+U_E{9#o%2RPv2FScSe>>^0%LLXVg9J*gi_`l2A6N#7}_ zq{o+Xk~%2bK1r}}$5FyTC{>D5)vWh)=_VuZY47}3Wt9rP{BGJW+tPf|-1*zIUw$p^ zmj>l8f>Kw|&;0~MhL~SKbNgd_$2khT{|Wssgi(J*-+v7MEn(*epZ^r&{|N;CDd>nG z;?MB?UARC8-pMUKM%m>*9HPsw`pK8i!NLF(*TIS&U9Q75Iqq`|{sIFWL+A_*$>4C6 zlS8Ky4(B&8xvPW!;KJ$Q>u@2Ggu|7MDP%M2+(>C{ph-i}IPA z&YVY-y)6;zmPd}#d(H*d=7?+af~z^=YF==8BQ9@97jbomu11`@qmG_0by{2Aa~+^1 z&Gx)eTl-^1O=8-JYg=eI;@lN=>`s#yuM3~0x-gRVgChR=n1%Mkk@mw2?Z+eS$HS)v zBJBfF&*_KOGpMAVO;(cWTvZKGnux0_bRy#18FlPRLzL{j_x`o1xk;07&g^iKI z#@T{MVJob;iVQ@X$(+nUu+rN5Vdb3h$I?&*Svb5qo@nMSlKMF7`qng*_EjyhUIFcNzb7e5O}BpYlrJ63FVedrbZ1x=*{|zm2-js(K9l?YbXp zdrZf)y1(22|K;oEtv$KN+`7N=_T(LF(EYodJ=S9#x}TOC`qvwOy3x?zYW!)tp?{b0 zbFJZ+)%bb7;h4+#x!Z88-uQWg;aHpT^A5wYU1{b-jQ&;4iC_(ZcU}~4p~!{ul81g1 zPx1*0b0npiks7K+5jJ(O7RBbmt8+pOW`#!v3%JtW)=CD*Hh4)~Z zRI8-$2(W3L3H%L^prEAWNXM9xbyGR?JQA`2reyCUS3TYlT{oq_e{p8x!lvz!P1_eX z?T&2Py|8I-WYgYg{l0nqJR2T(4Ys_O6@G~~sXf<0n&1l~TGXhrke`%Ot+M0GMK~A4 zF%5TBd%@wS6diubHo%~SPAr>XBwKJcMVw6w&bElNZ8i{bZi_m)fk4^cr}-wJB{vUg zfn1ksQfSdjX-V}wa@9`-_)D~L|9RAP>`T0U?70pQVNFe5H1J%IXnNHuidIaEmYNN^ zLOe%Th-C(X=ewXTA2SfFJhx*}7zkFL*B}`T1S`+2Jm^XQjjZ49soI~f`(aT}*M7I| zM-A=!H|l=e-IKfDtNTg5VZY1x6SraidgD(v8uojPKk*v&??@g2amj{Q1z}|ctb(Eg ztkONI(2oma2$^9bzssJRlFbx~_mGjBw83nSxxyp%VHxu_vZfg`kGJOhEwB`ktCT;S zlx6MbE&xr`oe|G5A`8&;*rYiA`~m|yA&Tet0~2@%)-cBTAb>R`;)!SzCAiZv>j;+!ToGQ8Ib)hv&6>-s4YK06^Em)G*oO2HPdaWU6^9z^RvI^(r_H%>K zlKv)DSu%eJdX^zPY;TC3>{bgOMF(cS`!FK}0Z8gUs2@sl z3ak2|B!m7cGU2aNCUmS{aI{Ap(0jnBd)q9spzHpDkB@$IbT&BGI^PyMd^{Y(Y0 z2d>7gI}$S;RRc^@R%C87kVgis%c__=dF>f?`vDexlr9D*tH%k5Td<4omQLIqs5GG6 z)ZEnG)bZU9?8*?-c5yewEy;1!O3PrN5DUsL>@Wj`^HvV1@CttXHw`y)P}7!_L71fR zrGljaa(Je=-hMMj0*@M~?2(q4-$ft}%y$kF_b*rjegt?+*u_hRM8e3QV%!!CkeUXw z$gL9Rs(jM94he4a-2X-dY)J0^V1R56CpOl>e{nNmZ0u>NXTHS`Z{SHbF&>DU#S}Eq zP#n01Faeynfdf81Ts@{h8eD=a{OezfA24p~@UJ(7TAE@Cz#Q+H*5|Kt2Try!8 zx;B1c;u>r(VPz7*{XL`vLj#Hh*MQj(v-oCwBb<*)xP;=fkun5(Y*2w`O$fMZ*W8bOe z`*T*uvt?S(q198v>zswjj@ZkuF*V}SF3^_yg0#Ktl3FDtwY?y1#F1VoX}*{msP*=K zIzuBqyc+ucThO4e_(X;u4HY~s{elD35?XFRaUxPlV6!?O2e$>$!1DX9fhgjT`=D%fT)ntB(KE-*w?5epw6)4$*6HqYiN6NUEc`d8=7AHaY%pBV(55ssQ9|Z zkoP30+hy3Td9p`qGW2MkIIITm6L%BDe^s*q!jl?<;i%?Gp4M<&^TcGr(2)o6RaQgZ zQ+I)ZmYZbWP(#$Jxar!sKZv{&HxG}4_TJgi;-PyP3x(fJ#3%r6_mcCHfjbzwfs&|j zs3?&0lH;yaw5GRi1TRmFbGZnFe9hS~$io0f<+ww{@m;^@dyA-MbafU-Xb#=4xFQU2 zfr75nk_B8`AK=IWF6y!IA~7Ao&7K_K95Vc}WNW literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_init.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_init.py new file mode 100644 index 00000000..0a6ed1aa --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_init.py @@ -0,0 +1,838 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import unittest + +import aniso8601 +from aniso8601.builders import ( + BaseTimeBuilder, + DatetimeTuple, + DateTuple, + DurationTuple, + IntervalTuple, + RepeatingIntervalTuple, + TimeTuple, + TimezoneTuple, + TupleBuilder, + cast, +) +from aniso8601.exceptions import ( + DayOutOfBoundsError, + HoursOutOfBoundsError, + ISOFormatError, + LeapSecondError, + MidnightBoundsError, + MinutesOutOfBoundsError, + MonthOutOfBoundsError, + SecondsOutOfBoundsError, + WeekOutOfBoundsError, +) +from aniso8601.tests.compat import mock + + +class LeapSecondSupportingTestBuilder(BaseTimeBuilder): + LEAP_SECONDS_SUPPORTED = True + + +class TestBuilderFunctions(unittest.TestCase): + def test_cast(self): + self.assertEqual(cast("1", int), 1) + self.assertEqual(cast("-2", int), -2) + self.assertEqual(cast("3", float), float(3)) + self.assertEqual(cast("-4", float), float(-4)) + self.assertEqual(cast("5.6", float), 5.6) + self.assertEqual(cast("-7.8", float), -7.8) + + def test_cast_exception(self): + with self.assertRaises(ISOFormatError): + cast("asdf", int) + + with self.assertRaises(ISOFormatError): + cast("asdf", float) + + def test_cast_caughtexception(self): + def tester(value): + raise RuntimeError + + with self.assertRaises(ISOFormatError): + cast("asdf", tester, caughtexceptions=(RuntimeError,)) + + def test_cast_thrownexception(self): + with self.assertRaises(RuntimeError): + cast("asdf", int, thrownexception=RuntimeError) + + +class TestBaseTimeBuilder(unittest.TestCase): + def test_build_date(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_date() + + def test_build_time(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_time() + + def test_build_datetime(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_datetime(None, None) + + def test_build_duration(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_duration() + + def test_build_interval(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_interval() + + def test_build_repeating_interval(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_repeating_interval() + + def test_build_timezone(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_timezone() + + def test_range_check_date(self): + # Check the calendar for day ranges + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="0007", MM="02", DD="30") + + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="0007", DDD="366") + + with self.assertRaises(MonthOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="4333", MM="30", DD="30") + + # 0 isn't a valid week number + with self.assertRaises(WeekOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="2003", Www="00") + + # Week must not be larger than 53 + with self.assertRaises(WeekOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="2004", Www="54") + + # 0 isn't a valid day number + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="2001", Www="02", D="0") + + # Day must not be larger than 7 + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="2001", Www="02", D="8") + + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="1981", DDD="000") + + # Day must be 365, or 366, not larger + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="1234", DDD="000") + + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="1234", DDD="367") + + # https://bitbucket.org/nielsenb/aniso8601/issues/14/parsing-ordinal-dates-should-only-allow + with self.assertRaises(DayOutOfBoundsError): + BaseTimeBuilder.range_check_date(YYYY="1981", DDD="366") + + # Make sure Nones pass through unmodified + self.assertEqual( + BaseTimeBuilder.range_check_date(rangedict={}), + (None, None, None, None, None, None), + ) + + def test_range_check_time(self): + # Leap seconds not supported + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + # https://bitbucket.org/nielsenb/aniso8601/issues/13/parsing-of-leap-second-gives-wildly + with self.assertRaises(LeapSecondError): + BaseTimeBuilder.range_check_time(hh="23", mm="59", ss="60") + + with self.assertRaises(SecondsOutOfBoundsError): + BaseTimeBuilder.range_check_time(hh="00", mm="00", ss="60") + + with self.assertRaises(SecondsOutOfBoundsError): + BaseTimeBuilder.range_check_time(hh="00", mm="00", ss="61") + + with self.assertRaises(MinutesOutOfBoundsError): + BaseTimeBuilder.range_check_time(hh="00", mm="61") + + with self.assertRaises(MinutesOutOfBoundsError): + BaseTimeBuilder.range_check_time(hh="00", mm="60") + + with self.assertRaises(MinutesOutOfBoundsError): + BaseTimeBuilder.range_check_time(hh="00", mm="60.1") + + with self.assertRaises(HoursOutOfBoundsError): + BaseTimeBuilder.range_check_time(hh="25") + + # Hour 24 can only represent midnight + with self.assertRaises(MidnightBoundsError): + BaseTimeBuilder.range_check_time(hh="24", mm="00", ss="01") + + with self.assertRaises(MidnightBoundsError): + BaseTimeBuilder.range_check_time(hh="24", mm="00.1") + + with self.assertRaises(MidnightBoundsError): + BaseTimeBuilder.range_check_time(hh="24", mm="01") + + with self.assertRaises(MidnightBoundsError): + BaseTimeBuilder.range_check_time(hh="24.1") + + # Leap seconds not supported + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + # https://bitbucket.org/nielsenb/aniso8601/issues/13/parsing-of-leap-second-gives-wildly + with self.assertRaises(LeapSecondError): + BaseTimeBuilder.range_check_time(hh="23", mm="59", ss="60") + + # Make sure Nones pass through unmodified + self.assertEqual( + BaseTimeBuilder.range_check_time(rangedict={}), (None, None, None, None) + ) + + def test_range_check_time_leap_seconds_supported(self): + self.assertEqual( + LeapSecondSupportingTestBuilder.range_check_time(hh="23", mm="59", ss="60"), + (23, 59, 60, None), + ) + + with self.assertRaises(SecondsOutOfBoundsError): + LeapSecondSupportingTestBuilder.range_check_time(hh="01", mm="02", ss="60") + + def test_range_check_duration(self): + self.assertEqual( + BaseTimeBuilder.range_check_duration(), + (None, None, None, None, None, None, None), + ) + + self.assertEqual( + BaseTimeBuilder.range_check_duration(rangedict={}), + (None, None, None, None, None, None, None), + ) + + def test_range_check_repeating_interval(self): + self.assertEqual( + BaseTimeBuilder.range_check_repeating_interval(), (None, None, None) + ) + + self.assertEqual( + BaseTimeBuilder.range_check_repeating_interval(rangedict={}), + (None, None, None), + ) + + def test_range_check_timezone(self): + self.assertEqual( + BaseTimeBuilder.range_check_timezone(), (None, None, None, None, "") + ) + + self.assertEqual( + BaseTimeBuilder.range_check_timezone(rangedict={}), + (None, None, None, None, ""), + ) + + def test_build_object(self): + datetest = ( + DateTuple("1", "2", "3", "4", "5", "6"), + {"YYYY": "1", "MM": "2", "DD": "3", "Www": "4", "D": "5", "DDD": "6"}, + ) + + timetest = ( + TimeTuple("1", "2", "3", TimezoneTuple(False, False, "4", "5", "tz name")), + { + "hh": "1", + "mm": "2", + "ss": "3", + "tz": TimezoneTuple(False, False, "4", "5", "tz name"), + }, + ) + + datetimetest = ( + DatetimeTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + TimeTuple( + "7", "8", "9", TimezoneTuple(True, False, "10", "11", "tz name") + ), + ), + ( + DateTuple("1", "2", "3", "4", "5", "6"), + TimeTuple( + "7", "8", "9", TimezoneTuple(True, False, "10", "11", "tz name") + ), + ), + ) + + durationtest = ( + DurationTuple("1", "2", "3", "4", "5", "6", "7"), + { + "PnY": "1", + "PnM": "2", + "PnW": "3", + "PnD": "4", + "TnH": "5", + "TnM": "6", + "TnS": "7", + }, + ) + + intervaltests = ( + ( + IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + DateTuple("7", "8", "9", "10", "11", "12"), + None, + ), + { + "start": DateTuple("1", "2", "3", "4", "5", "6"), + "end": DateTuple("7", "8", "9", "10", "11", "12"), + "duration": None, + }, + ), + ( + IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + None, + DurationTuple("7", "8", "9", "10", "11", "12", "13"), + ), + { + "start": DateTuple("1", "2", "3", "4", "5", "6"), + "end": None, + "duration": DurationTuple("7", "8", "9", "10", "11", "12", "13"), + }, + ), + ( + IntervalTuple( + None, + TimeTuple( + "1", "2", "3", TimezoneTuple(True, False, "4", "5", "tz name") + ), + DurationTuple("6", "7", "8", "9", "10", "11", "12"), + ), + { + "start": None, + "end": TimeTuple( + "1", "2", "3", TimezoneTuple(True, False, "4", "5", "tz name") + ), + "duration": DurationTuple("6", "7", "8", "9", "10", "11", "12"), + }, + ), + ) + + repeatingintervaltests = ( + ( + RepeatingIntervalTuple( + True, + None, + IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + DateTuple("7", "8", "9", "10", "11", "12"), + None, + ), + ), + { + "R": True, + "Rnn": None, + "interval": IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + DateTuple("7", "8", "9", "10", "11", "12"), + None, + ), + }, + ), + ( + RepeatingIntervalTuple( + False, + "1", + IntervalTuple( + DatetimeTuple( + DateTuple("2", "3", "4", "5", "6", "7"), + TimeTuple("8", "9", "10", None), + ), + DatetimeTuple( + DateTuple("11", "12", "13", "14", "15", "16"), + TimeTuple("17", "18", "19", None), + ), + None, + ), + ), + { + "R": False, + "Rnn": "1", + "interval": IntervalTuple( + DatetimeTuple( + DateTuple("2", "3", "4", "5", "6", "7"), + TimeTuple("8", "9", "10", None), + ), + DatetimeTuple( + DateTuple("11", "12", "13", "14", "15", "16"), + TimeTuple("17", "18", "19", None), + ), + None, + ), + }, + ), + ) + + timezonetest = ( + TimezoneTuple(False, False, "1", "2", "+01:02"), + {"negative": False, "Z": False, "hh": "1", "mm": "2", "name": "+01:02"}, + ) + + with mock.patch.object( + aniso8601.builders.BaseTimeBuilder, "build_date" + ) as mock_build: + mock_build.return_value = datetest[0] + + result = BaseTimeBuilder._build_object(datetest[0]) + + self.assertEqual(result, datetest[0]) + mock_build.assert_called_once_with(**datetest[1]) + + with mock.patch.object( + aniso8601.builders.BaseTimeBuilder, "build_time" + ) as mock_build: + mock_build.return_value = timetest[0] + + result = BaseTimeBuilder._build_object(timetest[0]) + + self.assertEqual(result, timetest[0]) + mock_build.assert_called_once_with(**timetest[1]) + + with mock.patch.object( + aniso8601.builders.BaseTimeBuilder, "build_datetime" + ) as mock_build: + mock_build.return_value = datetimetest[0] + + result = BaseTimeBuilder._build_object(datetimetest[0]) + + self.assertEqual(result, datetimetest[0]) + mock_build.assert_called_once_with(*datetimetest[1]) + + with mock.patch.object( + aniso8601.builders.BaseTimeBuilder, "build_duration" + ) as mock_build: + mock_build.return_value = durationtest[0] + + result = BaseTimeBuilder._build_object(durationtest[0]) + + self.assertEqual(result, durationtest[0]) + mock_build.assert_called_once_with(**durationtest[1]) + + for intervaltest in intervaltests: + with mock.patch.object( + aniso8601.builders.BaseTimeBuilder, "build_interval" + ) as mock_build: + mock_build.return_value = intervaltest[0] + + result = BaseTimeBuilder._build_object(intervaltest[0]) + + self.assertEqual(result, intervaltest[0]) + mock_build.assert_called_once_with(**intervaltest[1]) + + for repeatingintervaltest in repeatingintervaltests: + with mock.patch.object( + aniso8601.builders.BaseTimeBuilder, "build_repeating_interval" + ) as mock_build: + mock_build.return_value = repeatingintervaltest[0] + + result = BaseTimeBuilder._build_object(repeatingintervaltest[0]) + + self.assertEqual(result, repeatingintervaltest[0]) + mock_build.assert_called_once_with(**repeatingintervaltest[1]) + + with mock.patch.object( + aniso8601.builders.BaseTimeBuilder, "build_timezone" + ) as mock_build: + mock_build.return_value = timezonetest[0] + + result = BaseTimeBuilder._build_object(timezonetest[0]) + + self.assertEqual(result, timezonetest[0]) + mock_build.assert_called_once_with(**timezonetest[1]) + + def test_is_interval_end_concise(self): + self.assertTrue( + BaseTimeBuilder._is_interval_end_concise(TimeTuple("1", "2", "3", None)) + ) + self.assertTrue( + BaseTimeBuilder._is_interval_end_concise( + DateTuple(None, "2", "3", "4", "5", "6") + ) + ) + self.assertTrue( + BaseTimeBuilder._is_interval_end_concise( + DatetimeTuple( + DateTuple(None, "2", "3", "4", "5", "6"), + TimeTuple("7", "8", "9", None), + ) + ) + ) + + self.assertFalse( + BaseTimeBuilder._is_interval_end_concise( + DateTuple("1", "2", "3", "4", "5", "6") + ) + ) + self.assertFalse( + BaseTimeBuilder._is_interval_end_concise( + DatetimeTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + TimeTuple("7", "8", "9", None), + ) + ) + ) + + def test_combine_concise_interval_tuples(self): + testtuples = ( + ( + DateTuple("2020", "01", "01", None, None, None), + DateTuple(None, None, "02", None, None, None), + DateTuple("2020", "01", "02", None, None, None), + ), + ( + DateTuple("2008", "02", "15", None, None, None), + DateTuple(None, "03", "14", None, None, None), + DateTuple("2008", "03", "14", None, None, None), + ), + ( + DatetimeTuple( + DateTuple("2007", "12", "14", None, None, None), + TimeTuple("13", "30", None, None), + ), + TimeTuple("15", "30", None, None), + DatetimeTuple( + DateTuple("2007", "12", "14", None, None, None), + TimeTuple("15", "30", None, None), + ), + ), + ( + DatetimeTuple( + DateTuple("2007", "11", "13", None, None, None), + TimeTuple("09", "00", None, None), + ), + DatetimeTuple( + DateTuple(None, None, "15", None, None, None), + TimeTuple("17", "00", None, None), + ), + DatetimeTuple( + DateTuple("2007", "11", "15", None, None, None), + TimeTuple("17", "00", None, None), + ), + ), + ( + DatetimeTuple( + DateTuple("2007", "11", "13", None, None, None), + TimeTuple("00", "00", None, None), + ), + DatetimeTuple( + DateTuple(None, None, "16", None, None, None), + TimeTuple("00", "00", None, None), + ), + DatetimeTuple( + DateTuple("2007", "11", "16", None, None, None), + TimeTuple("00", "00", None, None), + ), + ), + ( + DatetimeTuple( + DateTuple("2007", "11", "13", None, None, None), + TimeTuple( + "09", "00", None, TimezoneTuple(False, True, None, None, "Z") + ), + ), + DatetimeTuple( + DateTuple(None, None, "15", None, None, None), + TimeTuple("17", "00", None, None), + ), + DatetimeTuple( + DateTuple("2007", "11", "15", None, None, None), + TimeTuple( + "17", "00", None, TimezoneTuple(False, True, None, None, "Z") + ), + ), + ), + ) + + for testtuple in testtuples: + result = BaseTimeBuilder._combine_concise_interval_tuples( + testtuple[0], testtuple[1] + ) + self.assertEqual(result, testtuple[2]) + + +class TestTupleBuilder(unittest.TestCase): + def test_build_date(self): + datetuple = TupleBuilder.build_date() + + self.assertEqual(datetuple, DateTuple(None, None, None, None, None, None)) + + datetuple = TupleBuilder.build_date( + YYYY="1", MM="2", DD="3", Www="4", D="5", DDD="6" + ) + + self.assertEqual(datetuple, DateTuple("1", "2", "3", "4", "5", "6")) + + def test_build_time(self): + testtuples = ( + ({}, TimeTuple(None, None, None, None)), + ( + {"hh": "1", "mm": "2", "ss": "3", "tz": None}, + TimeTuple("1", "2", "3", None), + ), + ( + { + "hh": "1", + "mm": "2", + "ss": "3", + "tz": TimezoneTuple(False, False, "4", "5", "tz name"), + }, + TimeTuple( + "1", "2", "3", TimezoneTuple(False, False, "4", "5", "tz name") + ), + ), + ) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_time(**testtuple[0]), testtuple[1]) + + def test_build_datetime(self): + testtuples = ( + ( + { + "date": DateTuple("1", "2", "3", "4", "5", "6"), + "time": TimeTuple("7", "8", "9", None), + }, + DatetimeTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + TimeTuple("7", "8", "9", None), + ), + ), + ( + { + "date": DateTuple("1", "2", "3", "4", "5", "6"), + "time": TimeTuple( + "7", "8", "9", TimezoneTuple(True, False, "10", "11", "tz name") + ), + }, + DatetimeTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + TimeTuple( + "7", "8", "9", TimezoneTuple(True, False, "10", "11", "tz name") + ), + ), + ), + ) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_datetime(**testtuple[0]), testtuple[1]) + + def test_build_duration(self): + testtuples = ( + ({}, DurationTuple(None, None, None, None, None, None, None)), + ( + { + "PnY": "1", + "PnM": "2", + "PnW": "3", + "PnD": "4", + "TnH": "5", + "TnM": "6", + "TnS": "7", + }, + DurationTuple("1", "2", "3", "4", "5", "6", "7"), + ), + ) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_duration(**testtuple[0]), testtuple[1]) + + def test_build_interval(self): + testtuples = ( + ({}, IntervalTuple(None, None, None)), + ( + { + "start": DateTuple("1", "2", "3", "4", "5", "6"), + "end": DateTuple("7", "8", "9", "10", "11", "12"), + }, + IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + DateTuple("7", "8", "9", "10", "11", "12"), + None, + ), + ), + ( + { + "start": TimeTuple( + "1", "2", "3", TimezoneTuple(True, False, "7", "8", "tz name") + ), + "end": TimeTuple( + "4", "5", "6", TimezoneTuple(False, False, "9", "10", "tz name") + ), + }, + IntervalTuple( + TimeTuple( + "1", "2", "3", TimezoneTuple(True, False, "7", "8", "tz name") + ), + TimeTuple( + "4", "5", "6", TimezoneTuple(False, False, "9", "10", "tz name") + ), + None, + ), + ), + ( + { + "start": DatetimeTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + TimeTuple( + "7", + "8", + "9", + TimezoneTuple(True, False, "10", "11", "tz name"), + ), + ), + "end": DatetimeTuple( + DateTuple("12", "13", "14", "15", "16", "17"), + TimeTuple( + "18", + "19", + "20", + TimezoneTuple(False, False, "21", "22", "tz name"), + ), + ), + }, + IntervalTuple( + DatetimeTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + TimeTuple( + "7", + "8", + "9", + TimezoneTuple(True, False, "10", "11", "tz name"), + ), + ), + DatetimeTuple( + DateTuple("12", "13", "14", "15", "16", "17"), + TimeTuple( + "18", + "19", + "20", + TimezoneTuple(False, False, "21", "22", "tz name"), + ), + ), + None, + ), + ), + ( + { + "start": DateTuple("1", "2", "3", "4", "5", "6"), + "end": None, + "duration": DurationTuple("7", "8", "9", "10", "11", "12", "13"), + }, + IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + None, + DurationTuple("7", "8", "9", "10", "11", "12", "13"), + ), + ), + ( + { + "start": None, + "end": TimeTuple( + "1", "2", "3", TimezoneTuple(True, False, "4", "5", "tz name") + ), + "duration": DurationTuple("6", "7", "8", "9", "10", "11", "12"), + }, + IntervalTuple( + None, + TimeTuple( + "1", "2", "3", TimezoneTuple(True, False, "4", "5", "tz name") + ), + DurationTuple("6", "7", "8", "9", "10", "11", "12"), + ), + ), + ) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_interval(**testtuple[0]), testtuple[1]) + + def test_build_repeating_interval(self): + testtuples = ( + ({}, RepeatingIntervalTuple(None, None, None)), + ( + { + "R": True, + "interval": IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + DateTuple("7", "8", "9", "10", "11", "12"), + None, + ), + }, + RepeatingIntervalTuple( + True, + None, + IntervalTuple( + DateTuple("1", "2", "3", "4", "5", "6"), + DateTuple("7", "8", "9", "10", "11", "12"), + None, + ), + ), + ), + ( + { + "R": False, + "Rnn": "1", + "interval": IntervalTuple( + DatetimeTuple( + DateTuple("2", "3", "4", "5", "6", "7"), + TimeTuple("8", "9", "10", None), + ), + DatetimeTuple( + DateTuple("11", "12", "13", "14", "15", "16"), + TimeTuple("17", "18", "19", None), + ), + None, + ), + }, + RepeatingIntervalTuple( + False, + "1", + IntervalTuple( + DatetimeTuple( + DateTuple("2", "3", "4", "5", "6", "7"), + TimeTuple("8", "9", "10", None), + ), + DatetimeTuple( + DateTuple("11", "12", "13", "14", "15", "16"), + TimeTuple("17", "18", "19", None), + ), + None, + ), + ), + ), + ) + + for testtuple in testtuples: + result = TupleBuilder.build_repeating_interval(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_timezone(self): + testtuples = ( + ({}, TimezoneTuple(None, None, None, None, "")), + ( + {"negative": False, "Z": True, "name": "UTC"}, + TimezoneTuple(False, True, None, None, "UTC"), + ), + ( + {"negative": False, "Z": False, "hh": "1", "mm": "2", "name": "+01:02"}, + TimezoneTuple(False, False, "1", "2", "+01:02"), + ), + ( + {"negative": True, "Z": False, "hh": "1", "mm": "2", "name": "-01:02"}, + TimezoneTuple(True, False, "1", "2", "-01:02"), + ), + ) + + for testtuple in testtuples: + result = TupleBuilder.build_timezone(**testtuple[0]) + self.assertEqual(result, testtuple[1]) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_python.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_python.py new file mode 100644 index 00000000..ccbed27d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/builders/tests/test_python.py @@ -0,0 +1,1723 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import datetime +import unittest + +from aniso8601 import compat +from aniso8601.builders import ( + DatetimeTuple, + DateTuple, + DurationTuple, + IntervalTuple, + Limit, + TimeTuple, + TimezoneTuple, +) +from aniso8601.builders.python import ( + FractionalComponent, + PythonTimeBuilder, + _cast_to_fractional_component, + fractional_range_check, + year_range_check, +) +from aniso8601.exceptions import ( + DayOutOfBoundsError, + HoursOutOfBoundsError, + ISOFormatError, + LeapSecondError, + MidnightBoundsError, + MinutesOutOfBoundsError, + MonthOutOfBoundsError, + SecondsOutOfBoundsError, + WeekOutOfBoundsError, + YearOutOfBoundsError, +) +from aniso8601.utcoffset import UTCOffset + + +class TestPythonTimeBuilder_UtiltyFunctions(unittest.TestCase): + def test_year_range_check(self): + yearlimit = Limit( + "Invalid year string.", + 0000, + 9999, + YearOutOfBoundsError, + "Year must be between 1..9999.", + None, + ) + + self.assertEqual(year_range_check("19", yearlimit), 1900) + self.assertEqual(year_range_check("1234", yearlimit), 1234) + self.assertEqual(year_range_check("1985", yearlimit), 1985) + + def test_fractional_range_check(self): + limit = Limit( + "Invalid string.", -1, 1, ValueError, "Value must be between -1..1.", None + ) + + self.assertEqual(fractional_range_check(10, "1", limit), 1) + self.assertEqual(fractional_range_check(10, "-1", limit), -1) + self.assertEqual( + fractional_range_check(10, "0.1", limit), FractionalComponent(0, 1) + ) + self.assertEqual( + fractional_range_check(10, "-0.1", limit), FractionalComponent(-0, 1) + ) + + with self.assertRaises(ValueError): + fractional_range_check(10, "1.1", limit) + + with self.assertRaises(ValueError): + fractional_range_check(10, "-1.1", limit) + + def test_cast_to_fractional_component(self): + self.assertEqual( + _cast_to_fractional_component(10, "1.1"), FractionalComponent(1, 1) + ) + self.assertEqual( + _cast_to_fractional_component(10, "-1.1"), FractionalComponent(-1, 1) + ) + + self.assertEqual( + _cast_to_fractional_component(100, "1.1"), FractionalComponent(1, 10) + ) + self.assertEqual( + _cast_to_fractional_component(100, "-1.1"), FractionalComponent(-1, 10) + ) + + +class TestPythonTimeBuilder(unittest.TestCase): + def test_build_date(self): + testtuples = ( + ( + { + "YYYY": "2013", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(2013, 1, 1), + ), + ( + { + "YYYY": "0001", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1, 1, 1), + ), + ( + { + "YYYY": "19", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1900, 1, 1), + ), + ( + { + "YYYY": "10", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1000, 1, 1), + ), + ( + { + "YYYY": "1981", + "MM": "04", + "DD": "05", + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1981, 4, 5), + ), + ( + { + "YYYY": "1981", + "MM": "04", + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1981, 4, 1), + ), + ( + { + "YYYY": "1981", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": "095", + }, + datetime.date(1981, 4, 5), + ), + ( + { + "YYYY": "1981", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": "365", + }, + datetime.date(1981, 12, 31), + ), + ( + { + "YYYY": "1980", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": "366", + }, + datetime.date(1980, 12, 31), + ), + # Make sure we shift in zeros + ( + { + "YYYY": "1", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1000, 1, 1), + ), + ( + { + "YYYY": "12", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1200, 1, 1), + ), + ( + { + "YYYY": "123", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1230, 1, 1), + ), + ) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_date(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + # Test weekday + testtuples = ( + ( + { + "YYYY": "2004", + "MM": None, + "DD": None, + "Www": "53", + "D": None, + "DDD": None, + }, + datetime.date(2004, 12, 27), + 0, + ), + ( + { + "YYYY": "2009", + "MM": None, + "DD": None, + "Www": "01", + "D": None, + "DDD": None, + }, + datetime.date(2008, 12, 29), + 0, + ), + ( + { + "YYYY": "2010", + "MM": None, + "DD": None, + "Www": "01", + "D": None, + "DDD": None, + }, + datetime.date(2010, 1, 4), + 0, + ), + ( + { + "YYYY": "2009", + "MM": None, + "DD": None, + "Www": "53", + "D": None, + "DDD": None, + }, + datetime.date(2009, 12, 28), + 0, + ), + ( + { + "YYYY": "2009", + "MM": None, + "DD": None, + "Www": "01", + "D": "1", + "DDD": None, + }, + datetime.date(2008, 12, 29), + 0, + ), + ( + { + "YYYY": "2009", + "MM": None, + "DD": None, + "Www": "53", + "D": "7", + "DDD": None, + }, + datetime.date(2010, 1, 3), + 6, + ), + ( + { + "YYYY": "2010", + "MM": None, + "DD": None, + "Www": "01", + "D": "1", + "DDD": None, + }, + datetime.date(2010, 1, 4), + 0, + ), + ( + { + "YYYY": "2004", + "MM": None, + "DD": None, + "Www": "53", + "D": "6", + "DDD": None, + }, + datetime.date(2005, 1, 1), + 5, + ), + ) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_date(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + self.assertEqual(result.weekday(), testtuple[2]) + + def test_build_time(self): + testtuples = ( + ({}, datetime.time()), + ({"hh": "12.5"}, datetime.time(hour=12, minute=30)), + ( + {"hh": "23.99999999997"}, + datetime.time(hour=23, minute=59, second=59, microsecond=999999), + ), + ({"hh": "1", "mm": "23"}, datetime.time(hour=1, minute=23)), + ( + {"hh": "1", "mm": "23.4567"}, + datetime.time(hour=1, minute=23, second=27, microsecond=402000), + ), + ( + {"hh": "14", "mm": "43.999999997"}, + datetime.time(hour=14, minute=43, second=59, microsecond=999999), + ), + ( + {"hh": "1", "mm": "23", "ss": "45"}, + datetime.time(hour=1, minute=23, second=45), + ), + ( + {"hh": "23", "mm": "21", "ss": "28.512400"}, + datetime.time(hour=23, minute=21, second=28, microsecond=512400), + ), + ( + {"hh": "01", "mm": "03", "ss": "11.858714"}, + datetime.time(hour=1, minute=3, second=11, microsecond=858714), + ), + ( + {"hh": "14", "mm": "43", "ss": "59.9999997"}, + datetime.time(hour=14, minute=43, second=59, microsecond=999999), + ), + ({"hh": "24"}, datetime.time(hour=0)), + ({"hh": "24", "mm": "00"}, datetime.time(hour=0)), + ({"hh": "24", "mm": "00", "ss": "00"}, datetime.time(hour=0)), + ( + {"tz": TimezoneTuple(False, None, "00", "00", "UTC")}, + datetime.time(tzinfo=UTCOffset(name="UTC", minutes=0)), + ), + ( + { + "hh": "23", + "mm": "21", + "ss": "28.512400", + "tz": TimezoneTuple(False, None, "00", "00", "+00:00"), + }, + datetime.time( + hour=23, + minute=21, + second=28, + microsecond=512400, + tzinfo=UTCOffset(name="+00:00", minutes=0), + ), + ), + ( + { + "hh": "1", + "mm": "23", + "tz": TimezoneTuple(False, None, "01", "00", "+1"), + }, + datetime.time( + hour=1, minute=23, tzinfo=UTCOffset(name="+1", minutes=60) + ), + ), + ( + { + "hh": "1", + "mm": "23.4567", + "tz": TimezoneTuple(True, None, "01", "00", "-1"), + }, + datetime.time( + hour=1, + minute=23, + second=27, + microsecond=402000, + tzinfo=UTCOffset(name="-1", minutes=-60), + ), + ), + ( + { + "hh": "23", + "mm": "21", + "ss": "28.512400", + "tz": TimezoneTuple(False, None, "01", "30", "+1:30"), + }, + datetime.time( + hour=23, + minute=21, + second=28, + microsecond=512400, + tzinfo=UTCOffset(name="+1:30", minutes=90), + ), + ), + ( + { + "hh": "23", + "mm": "21", + "ss": "28.512400", + "tz": TimezoneTuple(False, None, "11", "15", "+11:15"), + }, + datetime.time( + hour=23, + minute=21, + second=28, + microsecond=512400, + tzinfo=UTCOffset(name="+11:15", minutes=675), + ), + ), + ( + { + "hh": "23", + "mm": "21", + "ss": "28.512400", + "tz": TimezoneTuple(False, None, "12", "34", "+12:34"), + }, + datetime.time( + hour=23, + minute=21, + second=28, + microsecond=512400, + tzinfo=UTCOffset(name="+12:34", minutes=754), + ), + ), + ( + { + "hh": "23", + "mm": "21", + "ss": "28.512400", + "tz": TimezoneTuple(False, None, "00", "00", "UTC"), + }, + datetime.time( + hour=23, + minute=21, + second=28, + microsecond=512400, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + ), + # Make sure we truncate, not round + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + # https://bitbucket.org/nielsenb/aniso8601/issues/21/sub-microsecond-precision-is-lost-when + ( + {"hh": "14.9999999999999999"}, + datetime.time(hour=14, minute=59, second=59, microsecond=999999), + ), + ({"mm": "0.00000000999"}, datetime.time()), + ({"mm": "0.0000000999"}, datetime.time(microsecond=5)), + ({"ss": "0.0000001"}, datetime.time()), + ({"ss": "2.0000048"}, datetime.time(second=2, microsecond=4)), + ) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_time(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_datetime(self): + testtuples = ( + ( + ( + DateTuple("2019", "06", "05", None, None, None), + TimeTuple("01", "03", "11.858714", None), + ), + datetime.datetime( + 2019, 6, 5, hour=1, minute=3, second=11, microsecond=858714 + ), + ), + ( + ( + DateTuple("1234", "02", "03", None, None, None), + TimeTuple("23", "21", "28.512400", None), + ), + datetime.datetime( + 1234, 2, 3, hour=23, minute=21, second=28, microsecond=512400 + ), + ), + ( + ( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple( + "23", + "21", + "28.512400", + TimezoneTuple(False, None, "11", "15", "+11:15"), + ), + ), + datetime.datetime( + 1981, + 4, + 5, + hour=23, + minute=21, + second=28, + microsecond=512400, + tzinfo=UTCOffset(name="+11:15", minutes=675), + ), + ), + ) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_datetime(*testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_duration(self): + testtuples = ( + ( + { + "PnY": "1", + "PnM": "2", + "PnD": "3", + "TnH": "4", + "TnM": "54", + "TnS": "6", + }, + datetime.timedelta(days=428, hours=4, minutes=54, seconds=6), + ), + ( + { + "PnY": "1", + "PnM": "2", + "PnD": "3", + "TnH": "4", + "TnM": "54", + "TnS": "6.5", + }, + datetime.timedelta(days=428, hours=4, minutes=54, seconds=6.5), + ), + ({"PnY": "1", "PnM": "2", "PnD": "3"}, datetime.timedelta(days=428)), + ({"PnY": "1", "PnM": "2", "PnD": "3.5"}, datetime.timedelta(days=428.5)), + ( + {"TnH": "4", "TnM": "54", "TnS": "6.5"}, + datetime.timedelta(hours=4, minutes=54, seconds=6.5), + ), + ( + {"TnH": "1", "TnM": "3", "TnS": "11.858714"}, + datetime.timedelta(hours=1, minutes=3, seconds=11, microseconds=858714), + ), + ( + {"TnH": "4", "TnM": "54", "TnS": "28.512400"}, + datetime.timedelta( + hours=4, minutes=54, seconds=28, microseconds=512400 + ), + ), + # Make sure we truncate, not round + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + # https://bitbucket.org/nielsenb/aniso8601/issues/21/sub-microsecond-precision-is-lost-when + ( + {"PnY": "1999.9999999999999999"}, + datetime.timedelta(days=729999, seconds=86399, microseconds=999999), + ), + ( + {"PnM": "1.9999999999999999"}, + datetime.timedelta( + days=59, hours=23, minutes=59, seconds=59, microseconds=999999 + ), + ), + ( + {"PnW": "1.9999999999999999"}, + datetime.timedelta( + days=13, hours=23, minutes=59, seconds=59, microseconds=999999 + ), + ), + ( + {"PnD": "1.9999999999999999"}, + datetime.timedelta( + days=1, hours=23, minutes=59, seconds=59, microseconds=999999 + ), + ), + ( + {"TnH": "14.9999999999999999"}, + datetime.timedelta( + hours=14, minutes=59, seconds=59, microseconds=999999 + ), + ), + ({"TnM": "0.00000000999"}, datetime.timedelta(0)), + ({"TnM": "0.0000000999"}, datetime.timedelta(microseconds=5)), + ({"TnS": "0.0000001"}, datetime.timedelta(0)), + ({"TnS": "2.0000048"}, datetime.timedelta(seconds=2, microseconds=4)), + ({"PnY": "1"}, datetime.timedelta(days=365)), + ({"PnY": "1.5"}, datetime.timedelta(days=547.5)), + ({"PnM": "1"}, datetime.timedelta(days=30)), + ({"PnM": "1.5"}, datetime.timedelta(days=45)), + ({"PnW": "1"}, datetime.timedelta(days=7)), + ({"PnW": "1.5"}, datetime.timedelta(days=10.5)), + ({"PnD": "1"}, datetime.timedelta(days=1)), + ({"PnD": "1.5"}, datetime.timedelta(days=1.5)), + ( + { + "PnY": "0003", + "PnM": "06", + "PnD": "04", + "TnH": "12", + "TnM": "30", + "TnS": "05", + }, + datetime.timedelta(days=1279, hours=12, minutes=30, seconds=5), + ), + ( + { + "PnY": "0003", + "PnM": "06", + "PnD": "04", + "TnH": "12", + "TnM": "30", + "TnS": "05.5", + }, + datetime.timedelta(days=1279, hours=12, minutes=30, seconds=5.5), + ), + # Test timedelta limit + ( + {"PnD": "999999999", "TnH": "23", "TnM": "59", "TnS": "59.999999"}, + datetime.timedelta.max, + ), + # Make sure we truncate, not round + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + ( + { + "PnY": "0001", + "PnM": "02", + "PnD": "03", + "TnH": "14", + "TnM": "43", + "TnS": "59.9999997", + }, + datetime.timedelta( + days=428, hours=14, minutes=43, seconds=59, microseconds=999999 + ), + ), + # Verify overflows + ({"TnH": "36"}, datetime.timedelta(days=1, hours=12)), + ) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_duration(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_interval(self): + testtuples = ( + ( + { + "end": DatetimeTuple( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + "duration": DurationTuple(None, "1", None, None, None, None, None), + }, + datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1), + datetime.datetime(year=1981, month=3, day=6, hour=1, minute=1), + ), + ( + { + "end": DateTuple("1981", "04", "05", None, None, None), + "duration": DurationTuple(None, "1", None, None, None, None, None), + }, + datetime.date(year=1981, month=4, day=5), + datetime.date(year=1981, month=3, day=6), + ), + ( + { + "end": DateTuple("2018", "03", "06", None, None, None), + "duration": DurationTuple( + "1.5", None, None, None, None, None, None + ), + }, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2016, month=9, day=4, hour=12), + ), + ( + { + "end": DateTuple("2014", "11", "12", None, None, None), + "duration": DurationTuple(None, None, None, None, "1", None, None), + }, + datetime.date(year=2014, month=11, day=12), + datetime.datetime(year=2014, month=11, day=11, hour=23), + ), + ( + { + "end": DateTuple("2014", "11", "12", None, None, None), + "duration": DurationTuple(None, None, None, None, "4", "54", "6.5"), + }, + datetime.date(year=2014, month=11, day=12), + datetime.datetime( + year=2014, + month=11, + day=11, + hour=19, + minute=5, + second=53, + microsecond=500000, + ), + ), + ( + { + "end": DatetimeTuple( + DateTuple("2050", "03", "01", None, None, None), + TimeTuple( + "13", + "00", + "00", + TimezoneTuple(False, True, None, None, "Z"), + ), + ), + "duration": DurationTuple(None, None, None, None, "10", None, None), + }, + datetime.datetime( + year=2050, + month=3, + day=1, + hour=13, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + datetime.datetime( + year=2050, + month=3, + day=1, + hour=3, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + ), + # Make sure we truncate, not round + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + # https://bitbucket.org/nielsenb/aniso8601/issues/21/sub-microsecond-precision-is-lost-when + ( + { + "end": DateTuple("2000", "01", "01", None, None, None), + "duration": DurationTuple( + "1999.9999999999999999", None, None, None, None, None, None + ), + }, + datetime.date(year=2000, month=1, day=1), + datetime.datetime( + year=1, month=4, day=30, hour=0, minute=0, second=0, microsecond=1 + ), + ), + ( + { + "end": DateTuple("1989", "03", "01", None, None, None), + "duration": DurationTuple( + None, "1.9999999999999999", None, None, None, None, None + ), + }, + datetime.date(year=1989, month=3, day=1), + datetime.datetime( + year=1988, + month=12, + day=31, + hour=0, + minute=0, + second=0, + microsecond=1, + ), + ), + ( + { + "end": DateTuple("1989", "03", "01", None, None, None), + "duration": DurationTuple( + None, None, "1.9999999999999999", None, None, None, None + ), + }, + datetime.date(year=1989, month=3, day=1), + datetime.datetime( + year=1989, + month=2, + day=15, + hour=0, + minute=0, + second=0, + microsecond=1, + ), + ), + ( + { + "end": DateTuple("1989", "03", "01", None, None, None), + "duration": DurationTuple( + None, None, None, "1.9999999999999999", None, None, None + ), + }, + datetime.date(year=1989, month=3, day=1), + datetime.datetime( + year=1989, + month=2, + day=27, + hour=0, + minute=0, + second=0, + microsecond=1, + ), + ), + ( + { + "end": DateTuple("2001", "01", "01", None, None, None), + "duration": DurationTuple( + None, None, None, None, "14.9999999999999999", None, None + ), + }, + datetime.date(year=2001, month=1, day=1), + datetime.datetime( + year=2000, + month=12, + day=31, + hour=9, + minute=0, + second=0, + microsecond=1, + ), + ), + ( + { + "end": DateTuple("2001", "01", "01", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, "0.00000000999", None + ), + }, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2001, month=1, day=1), + ), + ( + { + "end": DateTuple("2001", "01", "01", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, "0.0000000999", None + ), + }, + datetime.date(year=2001, month=1, day=1), + datetime.datetime( + year=2000, + month=12, + day=31, + hour=23, + minute=59, + second=59, + microsecond=999995, + ), + ), + ( + { + "end": DateTuple("2018", "03", "06", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, None, "0.0000001" + ), + }, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2018, month=3, day=6), + ), + ( + { + "end": DateTuple("2018", "03", "06", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, None, "2.0000048" + ), + }, + datetime.date(year=2018, month=3, day=6), + datetime.datetime( + year=2018, + month=3, + day=5, + hour=23, + minute=59, + second=57, + microsecond=999996, + ), + ), + ( + { + "start": DatetimeTuple( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + "duration": DurationTuple(None, "1", None, "1", None, "1", None), + }, + datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1), + datetime.datetime(year=1981, month=5, day=6, hour=1, minute=2), + ), + ( + { + "start": DateTuple("1981", "04", "05", None, None, None), + "duration": DurationTuple(None, "1", None, "1", None, None, None), + }, + datetime.date(year=1981, month=4, day=5), + datetime.date(year=1981, month=5, day=6), + ), + ( + { + "start": DateTuple("2018", "03", "06", None, None, None), + "duration": DurationTuple( + None, "2.5", None, None, None, None, None + ), + }, + datetime.date(year=2018, month=3, day=6), + datetime.date(year=2018, month=5, day=20), + ), + ( + { + "start": DateTuple("2014", "11", "12", None, None, None), + "duration": DurationTuple(None, None, None, None, "1", None, None), + }, + datetime.date(year=2014, month=11, day=12), + datetime.datetime(year=2014, month=11, day=12, hour=1, minute=0), + ), + ( + { + "start": DateTuple("2014", "11", "12", None, None, None), + "duration": DurationTuple(None, None, None, None, "4", "54", "6.5"), + }, + datetime.date(year=2014, month=11, day=12), + datetime.datetime( + year=2014, + month=11, + day=12, + hour=4, + minute=54, + second=6, + microsecond=500000, + ), + ), + ( + { + "start": DatetimeTuple( + DateTuple("2050", "03", "01", None, None, None), + TimeTuple( + "13", + "00", + "00", + TimezoneTuple(False, True, None, None, "Z"), + ), + ), + "duration": DurationTuple(None, None, None, None, "10", None, None), + }, + datetime.datetime( + year=2050, + month=3, + day=1, + hour=13, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + datetime.datetime( + year=2050, + month=3, + day=1, + hour=23, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + ), + # Make sure we truncate, not round + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + ( + { + "start": DateTuple("0001", "01", "01", None, None, None), + "duration": DurationTuple( + "1999.9999999999999999", None, None, None, None, None, None + ), + }, + datetime.date(year=1, month=1, day=1), + datetime.datetime( + year=1999, + month=9, + day=3, + hour=23, + minute=59, + second=59, + microsecond=999999, + ), + ), + ( + { + "start": DateTuple("1989", "03", "01", None, None, None), + "duration": DurationTuple( + None, "1.9999999999999999", None, None, None, None, None + ), + }, + datetime.date(year=1989, month=3, day=1), + datetime.datetime( + year=1989, + month=4, + day=29, + hour=23, + minute=59, + second=59, + microsecond=999999, + ), + ), + ( + { + "start": DateTuple("1989", "03", "01", None, None, None), + "duration": DurationTuple( + None, None, "1.9999999999999999", None, None, None, None + ), + }, + datetime.date(year=1989, month=3, day=1), + datetime.datetime( + year=1989, + month=3, + day=14, + hour=23, + minute=59, + second=59, + microsecond=999999, + ), + ), + ( + { + "start": DateTuple("1989", "03", "01", None, None, None), + "duration": DurationTuple( + None, None, None, "1.9999999999999999", None, None, None + ), + }, + datetime.date(year=1989, month=3, day=1), + datetime.datetime( + year=1989, + month=3, + day=2, + hour=23, + minute=59, + second=59, + microsecond=999999, + ), + ), + ( + { + "start": DateTuple("2001", "01", "01", None, None, None), + "duration": DurationTuple( + None, None, None, None, "14.9999999999999999", None, None + ), + }, + datetime.date(year=2001, month=1, day=1), + datetime.datetime( + year=2001, + month=1, + day=1, + hour=14, + minute=59, + second=59, + microsecond=999999, + ), + ), + ( + { + "start": DateTuple("2001", "01", "01", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, "0.00000000999", None + ), + }, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2001, month=1, day=1), + ), + ( + { + "start": DateTuple("2001", "01", "01", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, "0.0000000999", None + ), + }, + datetime.date(year=2001, month=1, day=1), + datetime.datetime( + year=2001, month=1, day=1, hour=0, minute=0, second=0, microsecond=5 + ), + ), + ( + { + "start": DateTuple("2018", "03", "06", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, None, "0.0000001" + ), + }, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2018, month=3, day=6), + ), + ( + { + "start": DateTuple("2018", "03", "06", None, None, None), + "duration": DurationTuple( + None, None, None, None, None, None, "2.0000048" + ), + }, + datetime.date(year=2018, month=3, day=6), + datetime.datetime( + year=2018, month=3, day=6, hour=0, minute=0, second=2, microsecond=4 + ), + ), + ( + { + "start": DatetimeTuple( + DateTuple("1980", "03", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + "end": DatetimeTuple( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + }, + datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1), + datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1), + ), + ( + { + "start": DatetimeTuple( + DateTuple("1980", "03", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + "end": DateTuple("1981", "04", "05", None, None, None), + }, + datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1), + datetime.date(year=1981, month=4, day=5), + ), + ( + { + "start": DateTuple("1980", "03", "05", None, None, None), + "end": DatetimeTuple( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + }, + datetime.date(year=1980, month=3, day=5), + datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1), + ), + ( + { + "start": DateTuple("1980", "03", "05", None, None, None), + "end": DateTuple("1981", "04", "05", None, None, None), + }, + datetime.date(year=1980, month=3, day=5), + datetime.date(year=1981, month=4, day=5), + ), + ( + { + "start": DateTuple("1981", "04", "05", None, None, None), + "end": DateTuple("1980", "03", "05", None, None, None), + }, + datetime.date(year=1981, month=4, day=5), + datetime.date(year=1980, month=3, day=5), + ), + ( + { + "start": DatetimeTuple( + DateTuple("2050", "03", "01", None, None, None), + TimeTuple( + "13", + "00", + "00", + TimezoneTuple(False, True, None, None, "Z"), + ), + ), + "end": DatetimeTuple( + DateTuple("2050", "05", "11", None, None, None), + TimeTuple( + "15", + "30", + "00", + TimezoneTuple(False, True, None, None, "Z"), + ), + ), + }, + datetime.datetime( + year=2050, + month=3, + day=1, + hour=13, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + datetime.datetime( + year=2050, + month=5, + day=11, + hour=15, + minute=30, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + ), + # Test concise representation + ( + { + "start": DateTuple("2020", "01", "01", None, None, None), + "end": DateTuple(None, None, "02", None, None, None), + }, + datetime.date(year=2020, month=1, day=1), + datetime.date(year=2020, month=1, day=2), + ), + ( + { + "start": DateTuple("2008", "02", "15", None, None, None), + "end": DateTuple(None, "03", "14", None, None, None), + }, + datetime.date(year=2008, month=2, day=15), + datetime.date(year=2008, month=3, day=14), + ), + ( + { + "start": DatetimeTuple( + DateTuple("2007", "12", "14", None, None, None), + TimeTuple("13", "30", None, None), + ), + "end": TimeTuple("15", "30", None, None), + }, + datetime.datetime(year=2007, month=12, day=14, hour=13, minute=30), + datetime.datetime(year=2007, month=12, day=14, hour=15, minute=30), + ), + ( + { + "start": DatetimeTuple( + DateTuple("2007", "11", "13", None, None, None), + TimeTuple("09", "00", None, None), + ), + "end": DatetimeTuple( + DateTuple(None, None, "15", None, None, None), + TimeTuple("17", "00", None, None), + ), + }, + datetime.datetime(year=2007, month=11, day=13, hour=9), + datetime.datetime(year=2007, month=11, day=15, hour=17), + ), + ( + { + "start": DatetimeTuple( + DateTuple("2007", "11", "13", None, None, None), + TimeTuple("00", "00", None, None), + ), + "end": DatetimeTuple( + DateTuple(None, None, "16", None, None, None), + TimeTuple("00", "00", None, None), + ), + }, + datetime.datetime(year=2007, month=11, day=13), + datetime.datetime(year=2007, month=11, day=16), + ), + ( + { + "start": DatetimeTuple( + DateTuple("2007", "11", "13", None, None, None), + TimeTuple( + "09", + "00", + None, + TimezoneTuple(False, True, None, None, "Z"), + ), + ), + "end": DatetimeTuple( + DateTuple(None, None, "15", None, None, None), + TimeTuple("17", "00", None, None), + ), + }, + datetime.datetime( + year=2007, + month=11, + day=13, + hour=9, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + datetime.datetime( + year=2007, + month=11, + day=15, + hour=17, + tzinfo=UTCOffset(name="UTC", minutes=0), + ), + ), + ( + { + "start": DatetimeTuple( + DateTuple("2007", "11", "13", None, None, None), + TimeTuple("09", "00", None, None), + ), + "end": TimeTuple("12", "34.567", None, None), + }, + datetime.datetime(year=2007, month=11, day=13, hour=9), + datetime.datetime( + year=2007, + month=11, + day=13, + hour=12, + minute=34, + second=34, + microsecond=20000, + ), + ), + ( + { + "start": DateTuple("2007", "11", "13", None, None, None), + "end": TimeTuple("12", "34", None, None), + }, + datetime.date(year=2007, month=11, day=13), + datetime.datetime(year=2007, month=11, day=13, hour=12, minute=34), + ), + # Make sure we truncate, not round + # https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + ( + { + "start": DatetimeTuple( + DateTuple("1980", "03", "05", None, None, None), + TimeTuple("01", "01", "00.0000001", None), + ), + "end": DatetimeTuple( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple("14", "43", "59.9999997", None), + ), + }, + datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1), + datetime.datetime( + year=1981, + month=4, + day=5, + hour=14, + minute=43, + second=59, + microsecond=999999, + ), + ), + ) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_interval(**testtuple[0]) + self.assertEqual(result[0], testtuple[1]) + self.assertEqual(result[1], testtuple[2]) + + def test_build_repeating_interval(self): + args = { + "Rnn": "3", + "interval": IntervalTuple( + DateTuple("1981", "04", "05", None, None, None), + None, + DurationTuple(None, None, None, "1", None, None, None), + ), + } + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + self.assertEqual(results[0], datetime.date(year=1981, month=4, day=5)) + self.assertEqual(results[1], datetime.date(year=1981, month=4, day=6)) + self.assertEqual(results[2], datetime.date(year=1981, month=4, day=7)) + + args = { + "Rnn": "11", + "interval": IntervalTuple( + None, + DatetimeTuple( + DateTuple("1980", "03", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + DurationTuple(None, None, None, None, "1", "2", None), + ), + } + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + for dateindex in compat.range(0, 11): + self.assertEqual( + results[dateindex], + datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) + - dateindex * datetime.timedelta(hours=1, minutes=2), + ) + + args = { + "Rnn": "2", + "interval": IntervalTuple( + DatetimeTuple( + DateTuple("1980", "03", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + DatetimeTuple( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + None, + ), + } + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + self.assertEqual( + results[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) + ) + self.assertEqual( + results[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1) + ) + + args = { + "Rnn": "2", + "interval": IntervalTuple( + DatetimeTuple( + DateTuple("1980", "03", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + DatetimeTuple( + DateTuple("1981", "04", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + None, + ), + } + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + self.assertEqual( + results[0], datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) + ) + self.assertEqual( + results[1], datetime.datetime(year=1981, month=4, day=5, hour=1, minute=1) + ) + + args = { + "R": True, + "interval": IntervalTuple( + None, + DatetimeTuple( + DateTuple("1980", "03", "05", None, None, None), + TimeTuple("01", "01", "00", None), + ), + DurationTuple(None, None, None, None, "1", "2", None), + ), + } + resultgenerator = PythonTimeBuilder.build_repeating_interval(**args) + + # Test the first 11 generated + for dateindex in compat.range(0, 11): + self.assertEqual( + next(resultgenerator), + datetime.datetime(year=1980, month=3, day=5, hour=1, minute=1) + - dateindex * datetime.timedelta(hours=1, minutes=2), + ) + + args = { + "R": True, + "interval": IntervalTuple( + DateTuple("1981", "04", "05", None, None, None), + None, + DurationTuple(None, None, None, "1", None, None, None), + ), + } + resultgenerator = PythonTimeBuilder.build_repeating_interval(**args) + + # Test the first 11 generated + for dateindex in compat.range(0, 11): + self.assertEqual( + next(resultgenerator), + ( + datetime.datetime(year=1981, month=4, day=5, hour=0, minute=0) + + dateindex * datetime.timedelta(days=1) + ).date(), + ) + + def test_build_timezone(self): + testtuples = ( + ({"Z": True, "name": "Z"}, datetime.timedelta(hours=0), "UTC"), + ( + {"negative": False, "hh": "00", "mm": "00", "name": "+00:00"}, + datetime.timedelta(hours=0), + "+00:00", + ), + ( + {"negative": False, "hh": "01", "mm": "00", "name": "+01:00"}, + datetime.timedelta(hours=1), + "+01:00", + ), + ( + {"negative": True, "hh": "01", "mm": "00", "name": "-01:00"}, + -datetime.timedelta(hours=1), + "-01:00", + ), + ( + {"negative": False, "hh": "00", "mm": "12", "name": "+00:12"}, + datetime.timedelta(minutes=12), + "+00:12", + ), + ( + {"negative": False, "hh": "01", "mm": "23", "name": "+01:23"}, + datetime.timedelta(hours=1, minutes=23), + "+01:23", + ), + ( + {"negative": True, "hh": "01", "mm": "23", "name": "-01:23"}, + -datetime.timedelta(hours=1, minutes=23), + "-01:23", + ), + ( + {"negative": False, "hh": "00", "name": "+00"}, + datetime.timedelta(hours=0), + "+00", + ), + ( + {"negative": False, "hh": "01", "name": "+01"}, + datetime.timedelta(hours=1), + "+01", + ), + ( + {"negative": True, "hh": "01", "name": "-01"}, + -datetime.timedelta(hours=1), + "-01", + ), + ( + {"negative": False, "hh": "12", "name": "+12"}, + datetime.timedelta(hours=12), + "+12", + ), + ( + {"negative": True, "hh": "12", "name": "-12"}, + -datetime.timedelta(hours=12), + "-12", + ), + ) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_timezone(**testtuple[0]) + self.assertEqual(result.utcoffset(None), testtuple[1]) + self.assertEqual(result.tzname(None), testtuple[2]) + + def test_range_check_date(self): + # 0 isn't a valid year for a Python builder + with self.assertRaises(YearOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY="0000") + + # Leap year + # https://bitbucket.org/nielsenb/aniso8601/issues/14/parsing-ordinal-dates-should-only-allow + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY="1981", DDD="366") + + def test_range_check_time(self): + # Hour 24 can only represent midnight + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh="24", mm="00", ss="01") + + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh="24", mm="00.1") + + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh="24", mm="01") + + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh="24.1") + + def test_range_check_duration(self): + with self.assertRaises(YearOutOfBoundsError): + PythonTimeBuilder.build_duration( + PnY=str((datetime.timedelta.max.days // 365) + 1) + ) + + with self.assertRaises(MonthOutOfBoundsError): + PythonTimeBuilder.build_duration( + PnM=str((datetime.timedelta.max.days // 30) + 1) + ) + + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_duration(PnD=str(datetime.timedelta.max.days + 1)) + + with self.assertRaises(WeekOutOfBoundsError): + PythonTimeBuilder.build_duration( + PnW=str((datetime.timedelta.max.days // 7) + 1) + ) + + with self.assertRaises(HoursOutOfBoundsError): + PythonTimeBuilder.build_duration( + TnH=str((datetime.timedelta.max.days * 24) + 24) + ) + + with self.assertRaises(MinutesOutOfBoundsError): + PythonTimeBuilder.build_duration( + TnM=str((datetime.timedelta.max.days * 24 * 60) + 24 * 60) + ) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_duration( + TnS=str((datetime.timedelta.max.days * 24 * 60 * 60) + 24 * 60 * 60) + ) + + # Split max range across all parts + maxpart = datetime.timedelta.max.days // 7 + + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_duration( + PnY=str((maxpart // 365) + 1), + PnM=str((maxpart // 30) + 1), + PnD=str((maxpart + 1)), + PnW=str((maxpart // 7) + 1), + TnH=str((maxpart * 24) + 1), + TnM=str((maxpart * 24 * 60) + 1), + TnS=str((maxpart * 24 * 60 * 60) + 1), + ) + + def test_range_check_interval(self): + with self.assertRaises(YearOutOfBoundsError): + PythonTimeBuilder.build_interval( + start=DateTuple("0007", None, None, None, None, None), + duration=DurationTuple( + None, None, None, str(datetime.timedelta.max.days), None, None, None + ), + ) + + with self.assertRaises(YearOutOfBoundsError): + PythonTimeBuilder.build_interval( + start=DatetimeTuple( + DateTuple("0007", None, None, None, None, None), + TimeTuple("1", None, None, None), + ), + duration=DurationTuple( + str(datetime.timedelta.max.days // 365), + None, + None, + None, + None, + None, + None, + ), + ) + + with self.assertRaises(YearOutOfBoundsError): + PythonTimeBuilder.build_interval( + end=DateTuple("0001", None, None, None, None, None), + duration=DurationTuple("3", None, None, None, None, None, None), + ) + + with self.assertRaises(YearOutOfBoundsError): + PythonTimeBuilder.build_interval( + end=DatetimeTuple( + DateTuple("0001", None, None, None, None, None), + TimeTuple("1", None, None, None), + ), + duration=DurationTuple("2", None, None, None, None, None, None), + ) + + def test_build_week_date(self): + weekdate = PythonTimeBuilder._build_week_date(2009, 1) + self.assertEqual(weekdate, datetime.date(year=2008, month=12, day=29)) + + weekdate = PythonTimeBuilder._build_week_date(2009, 53, isoday=7) + self.assertEqual(weekdate, datetime.date(year=2010, month=1, day=3)) + + def test_build_ordinal_date(self): + ordinaldate = PythonTimeBuilder._build_ordinal_date(1981, 95) + self.assertEqual(ordinaldate, datetime.date(year=1981, month=4, day=5)) + + def test_iso_year_start(self): + yearstart = PythonTimeBuilder._iso_year_start(2004) + self.assertEqual(yearstart, datetime.date(year=2003, month=12, day=29)) + + yearstart = PythonTimeBuilder._iso_year_start(2010) + self.assertEqual(yearstart, datetime.date(year=2010, month=1, day=4)) + + yearstart = PythonTimeBuilder._iso_year_start(2009) + self.assertEqual(yearstart, datetime.date(year=2008, month=12, day=29)) + + def test_date_generator(self): + startdate = datetime.date(year=2018, month=8, day=29) + timedelta = datetime.timedelta(days=1) + iterations = 10 + + generator = PythonTimeBuilder._date_generator(startdate, timedelta, iterations) + + results = list(generator) + + for dateindex in compat.range(0, 10): + self.assertEqual( + results[dateindex], + datetime.date(year=2018, month=8, day=29) + + dateindex * datetime.timedelta(days=1), + ) + + def test_date_generator_unbounded(self): + startdate = datetime.date(year=2018, month=8, day=29) + timedelta = datetime.timedelta(days=5) + + generator = PythonTimeBuilder._date_generator_unbounded(startdate, timedelta) + + # Check the first 10 results + for dateindex in compat.range(0, 10): + self.assertEqual( + next(generator), + datetime.date(year=2018, month=8, day=29) + + dateindex * datetime.timedelta(days=5), + ) + + def test_distribute_microseconds(self): + self.assertEqual(PythonTimeBuilder._distribute_microseconds(1, (), ()), (1,)) + self.assertEqual( + PythonTimeBuilder._distribute_microseconds(11, (0,), (10,)), (1, 1) + ) + self.assertEqual( + PythonTimeBuilder._distribute_microseconds(211, (0, 0), (100, 10)), + (2, 1, 1), + ) + + self.assertEqual(PythonTimeBuilder._distribute_microseconds(1, (), ()), (1,)) + self.assertEqual( + PythonTimeBuilder._distribute_microseconds(11, (5,), (10,)), (6, 1) + ) + self.assertEqual( + PythonTimeBuilder._distribute_microseconds(211, (10, 5), (100, 10)), + (12, 6, 1), + ) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/compat.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/compat.py new file mode 100644 index 00000000..00cd3f9b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/compat.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import sys + +PY2 = sys.version_info[0] == 2 + +if PY2: # pragma: no cover + range = xrange # pylint: disable=undefined-variable +else: + range = range + + +def is_string(tocheck): + # pylint: disable=undefined-variable + if PY2: # pragma: no cover + return isinstance(tocheck, str) or isinstance(tocheck, unicode) + + return isinstance(tocheck, str) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/date.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/date.py new file mode 100644 index 00000000..42128483 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/date.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +from aniso8601.builders import TupleBuilder +from aniso8601.builders.python import PythonTimeBuilder +from aniso8601.compat import is_string +from aniso8601.exceptions import ISOFormatError +from aniso8601.resolution import DateResolution + + +def get_date_resolution(isodatestr): + # Valid string formats are: + # + # Y[YYY] + # YYYY-MM-DD + # YYYYMMDD + # YYYY-MM + # YYYY-Www + # YYYYWww + # YYYY-Www-D + # YYYYWwwD + # YYYY-DDD + # YYYYDDD + isodatetuple = parse_date(isodatestr, builder=TupleBuilder) + + if isodatetuple.DDD is not None: + # YYYY-DDD + # YYYYDDD + return DateResolution.Ordinal + + if isodatetuple.D is not None: + # YYYY-Www-D + # YYYYWwwD + return DateResolution.Weekday + + if isodatetuple.Www is not None: + # YYYY-Www + # YYYYWww + return DateResolution.Week + + if isodatetuple.DD is not None: + # YYYY-MM-DD + # YYYYMMDD + return DateResolution.Day + + if isodatetuple.MM is not None: + # YYYY-MM + return DateResolution.Month + + # Y[YYY] + return DateResolution.Year + + +def parse_date(isodatestr, builder=PythonTimeBuilder): + # Given a string in any ISO 8601 date format, return a datetime.date + # object that corresponds to the given date. Valid string formats are: + # + # YY + # YYYY + # YYYY-MM-DD + # YYYYMMDD + # YYYY-MM + # YYYY-Www + # YYYYWww + # YYYY-Www-D + # YYYYWwwD + # YYYY-DDD + # YYYYDDD + if is_string(isodatestr) is False: + raise ValueError("Date must be string.") + + if isodatestr.startswith("+") or isodatestr.startswith("-"): + raise NotImplementedError( + "ISO 8601 extended year representation not supported." + ) + + if len(isodatestr) == 0 or isodatestr.count("-") > 2: + raise ISOFormatError('"{0}" is not a valid ISO 8601 date.'.format(isodatestr)) + + yearstr = None + monthstr = None + daystr = None + weekstr = None + weekdaystr = None + ordinaldaystr = None + + if len(isodatestr) in (2, 4): + # YY + # YYYY + yearstr = isodatestr + elif "W" in isodatestr: + if len(isodatestr) == 10: + # YYYY-Www-D + yearstr = isodatestr[0:4] + weekstr = isodatestr[6:8] + weekdaystr = isodatestr[9] + elif len(isodatestr) == 8: + if "-" in isodatestr: + # YYYY-Www + yearstr = isodatestr[0:4] + weekstr = isodatestr[6:] + else: + # YYYYWwwD + yearstr = isodatestr[0:4] + weekstr = isodatestr[5:7] + weekdaystr = isodatestr[7] + elif len(isodatestr) == 7: + # YYYYWww + yearstr = isodatestr[0:4] + weekstr = isodatestr[5:] + elif len(isodatestr) == 7: + if "-" in isodatestr: + # YYYY-MM + yearstr = isodatestr[0:4] + monthstr = isodatestr[5:] + else: + # YYYYDDD + yearstr = isodatestr[0:4] + ordinaldaystr = isodatestr[4:] + elif len(isodatestr) == 8: + if "-" in isodatestr: + # YYYY-DDD + yearstr = isodatestr[0:4] + ordinaldaystr = isodatestr[5:] + else: + # YYYYMMDD + yearstr = isodatestr[0:4] + monthstr = isodatestr[4:6] + daystr = isodatestr[6:] + elif len(isodatestr) == 10: + # YYYY-MM-DD + yearstr = isodatestr[0:4] + monthstr = isodatestr[5:7] + daystr = isodatestr[8:] + else: + raise ISOFormatError('"{0}" is not a valid ISO 8601 date.'.format(isodatestr)) + + hascomponent = False + + for componentstr in [yearstr, monthstr, daystr, weekstr, weekdaystr, ordinaldaystr]: + if componentstr is not None: + hascomponent = True + + if componentstr.isdigit() is False: + raise ISOFormatError( + '"{0}" is not a valid ISO 8601 date.'.format(isodatestr) + ) + + if hascomponent is False: + raise ISOFormatError('"{0}" is not a valid ISO 8601 date.'.format(isodatestr)) + + return builder.build_date( + YYYY=yearstr, + MM=monthstr, + DD=daystr, + Www=weekstr, + D=weekdaystr, + DDD=ordinaldaystr, + ) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/decimalfraction.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/decimalfraction.py new file mode 100644 index 00000000..204d8a3f --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/decimalfraction.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + + +def normalize(value): + """Returns the string with decimal separators normalized.""" + return value.replace(",", ".") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/duration.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/duration.py new file mode 100644 index 00000000..8509dcef --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/aniso8601/duration.py @@ -0,0 +1,291 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +from aniso8601 import compat +from aniso8601.builders import TupleBuilder +from aniso8601.builders.python import PythonTimeBuilder +from aniso8601.date import parse_date +from aniso8601.decimalfraction import normalize +from aniso8601.exceptions import ISOFormatError +from aniso8601.resolution import DurationResolution +from aniso8601.time import parse_time + + +def get_duration_resolution(isodurationstr): + # Valid string formats are: + # + # PnYnMnDTnHnMnS (or any reduced precision equivalent) + # PnW + # PT
5 zu=WwOuh1IZ(x!P|wDK3!Bq~~!N+y#v6*HC17(;lkPR-0_bu(_5dMY#d3mO@v{=V5+ zOB_vdxcqJpBHnr#?-vA37!y?i)e1H6a^R9( zF&4T1}v$8p*$w}5_C~41!A>zXw@8T^P4;O^Im>1%#f^K;q-s~k2gn8jTaVYAu z!tr=UnbG2Lt9nv1YB1+7uSx2}u;`WkI3<~Sp3W0OgD{Wncz<-1{ z+(NNXMiVMvGzsA00_Lq(;^95vJ-=Rq2g{!wpSGmzTn00;C#cs^MJOI8io_Sz-HiyV zXhSPQ!tEttrFXC1fTu4pvQ9foZ>GN9;q+FN+;b?In%hG?`uN>L5hOOr1w7Egzl6me z!S6KQS6_Kyniyr(MLTfOk2<2$s_R?zD5v39U3tH=$I;V2!buCx3G(&SY2Pr`i3S+4 z^%g3i^|O5XX@f=rKgo>VznuVE(bRYnH_*DWrttVm>Mj9XmU=9C*9>_3EqD zI|{y=m9;l2+pbo&U8#(&)HmO#-+Hxv>&1Q7>N^ViZr0WpBEN-n4+A<#=lj19Z4dg` z92NEH8}Y{G9Ob;lrfW&3m2^%kTWsPj<6gYQDq;X-5T{_i+oA>ks}*M}mL9sW_x#>} z58uZo!Pqz&)N9em@srXi4$h5FEfAg0eSSKoR^2P8O;jnnwirx zR)F5nn=J@QWVR|gd%6#=3n5dBjbQ&fZAingHVYARepWjH$$C__I$;!zFsfP=@%T(u&810NRmI~kE0z*JF0ZDgvbf@;*JQoZw}HmhN%tV+~+F=|mGC`F07&S}Yi)mF6v zHPz~RwGt|>rXZXV$7)A}=msmuMXB;J*y*cT{gfeVXOyIwo|n_9Q<|*EYAR{UP=WHS zo;{sXp#$fXd4qJ`L@J$@Q>HwjXJ_a|Gb%`SWOdn?)siVC&HBO~Q1p~$#AJDNO49)n z|K?m4>T+f#n~`UsPc=QmAkJoIb7{py{glRFaj6xnU@rqH6zlSQHYX>chuQEYz01*1 zY%R?2>Fwnm2`goGHfBR3eB-n8gmGsFpy_sba$>S0%6km!vXUmWV9%V^Kn!P4Rhvj< z7=HFZIh~n2a(0$kK5{DKBF}dQUKJAvr_+YqJENIXy$OZ@l$@3{6GSeXvSeIvqlt(z z1roDqE3y}mF_q1wRe4;KX)kFi$U11sDOe_HBP-8l4I>3X!%Py5FOLl-XK=I)7!M9a zC8Nr7peo1FL8C-dXL4L#GHj-E2G~J^>0?s?6Z6t}|G>Uy56XMxQ9Z|(kcdAr(0^=T zH2%!Many9E8c3R*ozXI;d`g?|U~t!3BTk}D#~!lRW-ud>S=W1GY!jUkk#_x@0yae< z78y)1oRJTwGPyI@tExOaB7cnma`u*XhFl)mfE&cf?%f!6-Myx^x1)zPeUF*7P46DU zpu-kN8En&xnw>KU4LN~XB(O>_=oQso#ok#(S7u~An>FJEsMnDp^4wG^ImJlNxm!mk zS=S(EA==mqVqRaJ(n^Ah_G0a(!6zXz*2?>i$JK2b;smu&Y;tB`=|zanyvd6&8uC6}oEJ^9E7_&O zB!9!F`rmTBjc>!TohEZ?)s^?>eeVY@*>r=&Au0a@k{*UQ0XLRQ6i1rKUnEJ`ni4PF z1pr&dkq+l~-CS7QRkmn*XWbjQ$rM=u;=`90K z7&3u5r+{G0E|HB~G6`Z%FL z05OPF>9HQ|O>R{?W3q+QcVZ9dn{adXICrP*u7Hi^3l05jPB8|KmrYQY=WxSrZxw2o zC;jU4XP;j_a;>_n;QP3?{^Q!_m35mwZP>ihaR0kUuH3(;DERlb;#S{!%P%$76a}fe z2Ch(D(~a6KS8KOi^u7D=mD(-WYIj`;?_zQSbCqa;jHDyVNWi%QV+?N;tat6Ylb5(+3ofVCtqYi3;(n$ECAoW@~&7h#B3MLB)(-7MP-7gBqg>z5O31|Gr zg*h=AP=XNqB>ceM^J{Ku_(9|^z=VJy!NgP|ao}*@$TRUof?KV$3spTkJL}jwvpSrT zGhBMwvVx34TZB1rNh*rT&#}mdyVuF)oP|Cjb9YM5<|d~gQ;9za_5=(na%$MVfs-~f z%M2lGAPPv5SekJG!9bcJmwQI}R89BvAfe$X_Pg*S4-&|67gEt-A=!2{8$P7(IKTADj1M7tNMzp4cFe%$O-p=7ldX^)2+3{xaEt-N24KVAIA0iE=Ua>i6p_QVEf-7 z0$WwU2(dH16jo&5Oj2X923VeOcP?!z z1b^1J{>}EcyI$|Q*0}vMp)Jy0=wE4Ux$wmKCob-|-WXk}YyDYM%Y{Sd4=o$#hYJHM z4b3+i+OIaWUwrslLsy}{7zk81f85%(ti4gSBo!;5&6anc{pQV0_bmmMM$Sjj9}&TI z8w&?lHg10VvDY8FIQqtuXAc*iUD|)Mwe2&gz|N(>&Bk@hb5|R8tZdt{bZ~k9`6D+s z+;?%?>)q!=#Y!|N)(CCwg@a4`zk8(kI4~?efl+>ayIW`i0AF?Uf7LY=CH&qoC^~t0 zeR$ty-$$Dx`?{o$q9X2P4n-JE{Nzw{LP!2i=C&|xrwakey`U{^oeMqen%2{rYRG$>TZL+rWT*9uNLV|b*REzk)xIVinMbUJU2yTXxo zFeM$S@!&0#l^rf}_J~`H`6c)?5||^xJ{sb6rHQhv7t(p-F!lpjZOsa3XSC$dfje8D&9JB( zs7Kmrm0!iUrSpy$9gQ|JT|{aE3Mep*AfC=584@$=tcoLyhel!JQF@pD1W@W9Y0eg{YP4<55Zcps&QFtjgI z;kMhvLr=(RF=ZEa7>+qxmZ(~loaGoUmZ%vd0*MivTqflb%bhNs0r)$V8y0SGy4nTk zrAN*`a$(Q;Jr@H%s(Gj8gYdP+#|q(3tLkr5ZMs^uY58l{s&*8_mFBjBc&?)83q=|} zt#4kMx;T2hzN;vR)knp5Pkma~^n9>eYyL}_M=xf9Q}0Nrj?CPeE7mYEd1@lhv|R5@5=hag}!r#R;ucM zQ;Yz>9fRh6Ib6N(e&KTSgZsAlKa#?D{%DJ|uQT+~wh%qvAK72;|LCE;`>Xu_^l%IA zKdzEc;(CdIQ1TLgh!^NN*Eh_IC11{w_j;vCUM0IqejhZM>lcRF8cDmwR}BC z_rPatGU=p%4Kwd^#)6mUV?Nk6_+Vnxrz~OUH6$yOrDW+%BJzp&Aq7d9?F3JPsT-{3*o?j8CX^!7G^8CmWhOK8@R)RS4S04| zMpNA(88nmMPcjWqL4GiGlBo!yX&KxN$hvLF=fU`NW^oesk$Hm8O!Z9k5XW)!N2@=AaRI7o!d1rtX0jd3ES9z8vr++TUevTkTymc+Ej zF7M%qD-Iz~M*Ip-MFm51Kg;DsCvn2vedaiMI2CHs=vu zEHMD{Ni&*;&@MF0cxeMsssd>g@@Oe_$&!cT8e!%HA8ZGZ@}pTNr9rehjtq>Q@}$M( zd;ruO!-NK6s*EtVcT3swQR>>IAzX9HAeT3=sb?ps%Yis!LnhEDo(;-2vX@=CIsrN0 zO(IRs_L^x$SfG>9Fr5Ygjd{c$X0TyY&1091 zXc`4)CwdcndfiB~c4L_kOra<*nP4S$XY08Zx4SsyC?>p?MDPr0n}Xm%mXEP>*N)l7 znbQS06b)JxDL^GwK;T`57}pUEgR=_3Wrb46qkyHX5Mr*xQr;6gdOzBgo!8MRH&U+8 z`FNztjRD-C&z};7s+OhXo4c=9Zuzuf%SHdShHZuZPa9j7jMpB8pBIV2Gp%iS^~JL< zesA&9O;8@xN`v=McbtD-0jDI{0D0<0wP zyn-Gm2s(anolt(Xk0GrvFG>(IQdDzs!fo*qYp)cfpwKL}412~7Gd4{^nT_hUX$6MG+ zF+vjd6leoM?SSekFVS@jSy#xjRi2=;#P|05Xf=CbjZi|6J3$m@H~Fbv&J$CR-7p78 zg7ZM5R|OKy?4=}wf%6S#1J|x(({M@IOC};~NZGP}d)yNzj=?3;bQ}Ua!a3t4m~4(6 zjY=eVoyS(Pm&!iI0ShycAeRbV9Co4>blH@4{M$hm-E_Tk3JD3c5b%0<%P2KLi0YbU;6XAAJb7XeAH44pYHVx{<4^kJ9aHbfbfa`WW3# z(Cs8{Ru!#z+~$X9n4hJkligN;ID@;T0m9f4C-|Apanu?VD|9HwBd!q!i8yDWuHTar zq!L8H1mj2O0%f*eyq9-c41{er^d0jZ{|8Oi>K`Uobn}PzecZBPdFN}BOMY@WHy0aN zVo<(XD_?B9R=fR5c>Cv#R8Eb#zbW0r-@LND@9Ks=c$zowmB1E;QD@DUzhOr zk-p9T%TgGRmp4m&9ihuxL-gDg=@yO>8;(u&F`@mP~NLA$HRmlx=|3m?t?EHK!h={*3k&3Exgfn z$o(M$$UM(B?s+c!x!3Kq)ebvIX={WWi}xWXPrH+u<}9m3)}+g%nQW$;*+MLDrwiP^u4;&^9D{L1S z%o1ang}Wjw(*Us0=w)HM(}Tptw3Co0XcBgG7Q!o)4Oc2RuT(X?I(&9``QY`cZ7bor zS8LDKE(foNx2$Yve>?Vi?AnGdveDYl9xC)NHM@4&3eN+4KY{=~0{21iG`G@-ZJdiN zHfE*$6&@H1Ar-t9`#8&qrSG$sURn$yth)xAlvoXm-wLa!HZQFe_2T+SQ992_g05tzl=nE=H~KX1(S!7351RF)X6WS2 zm+QW-Z)70;?6Jcf#FS~y_Vxh4WNc0wr_Wj7CeM^ZV$kt55>kG)PY!fT*v04r5|=_|=w);) zPrI^OvVN#`HOrmCvz17Zk0Qv-N!wN zOMP&z5FwBZ){1B5?c|6POQH?ouBZ!$tw!0+v)0~2*!GcMx1(c9>8Y6#KmA_Opuh+} z$-s|fm#E?*^#$r+2q&3dfIQNlz|Ha_vqPtZFf-e-u_7)^E8^1Ds=>hy&m`HICrdnK ziKn^4ez&p1zG!n{Ei~EMqHOQ=le(A!B2X85a15&8TWM;gbn$D4KNBL6*0cKyeT5fR z8k<;{K61UW3mM^$Yui>@*1hRp9(<$bN^9qpmgsr^&6agb{*P;0S6bFzNS#l;c52Cw zHidl!I_kQ@5E45Ev2|vkn zsPhFA8Nhd1uqW|N5DqgQh15BWuR%_rG1n1l^bWU=ebVIpn23F}6crD^oOlF{ zd8mg@#aV&zY&Ok5Bl;t}(`htzxCt%yxh?4g!$Pa~t0@}S8OYN+sFTI5{~_H7yiPDZ z^#NvhFI4f!5HJKBUfqs{QQv{lXoUyFDHJX|=pEOL4G!C%Y_ai=aEHx1?~|U9(`(=m z)O7;8$&9Vh*&&)i9kD#E!cDn7L8zrXoM{z@P53vGvXheUS3Mp5_f@^w)p2(=v7wJZwqgmy`ImgfV0f zN)7Ov@DxAC+(k|4wu>rc)cpEo;g`Os6fS;U6uNg7LqTcl&Bka^!Y_=s#x7P;3=0)C zzlxyjc3q3KySPhe+g9{HE;X$j8v3`cf9d)qdv00J%X$v7U-s=6+7$Dm@RT@!55(Hg zp*6;TAKk-#StFF+dSaUtD~^gnYuifm`eJ2F+Htd?vnb&gXw*Jg4AE0qsBbPt=&3@e zZDg%*oU)?kRyCE4i^3z17yb1ZW!-N6d*B)N%SJ(Yu~Qflj{%dY)UdLC6aS5N^WOu9 z*ze8A`dbp}KYvaXrKd!`@rY#6X8N9PB8Sfbkxte9L`vp+7U+oxs(%GHD+mbz<3sPD zml{avQwv&dGL|z_X@f^ptH~aV_dh+*{|r8xuO%80ihK-sNoCTRFZv>r+Mr$RTIQAvq)^k(Ah!D3K#kLn)RmnU*Y5r1fwl+Ln|!W?~GR(@k>7 zdC=7}qR3DV?KKc`WGJUEgSB!|5Nu5DG<)bp#VufBKlzgAUMN_b8_^}ErU=OpQ$=!f-` ziHyAVV_A}}NSdU{F)1z&$};60F~^{Tznz0l{&o$z@pi__;^l+oyp1d7iB}9(@Vq-# z8TSr)kuTHAW4^d+u!`qBvFf;g(9iP~$kzl#$h!##c^H>Z`;0x0jde&ya;J<5;fep|T_$0lTd+F;Mr zu5Hm8F~fGPRoj5~4!k$w-NB*S1gM(qww=7J8D%YYS#a7BRDMUp2j#3+O(c>jH5E-J zi~;C&LANkBgtsOQrh z*e;h=r8)6-Yt@*Pv1uhjt#m_4jYSO;jxJ?tEE*Y8q6Qx)u4=lXo>QYSbvT9`wbhj#f~99@bV!+G z$@A0ZoS~4S=|+S_hxMKwrDH;$?ohD4Q2`Ob+c&01CNP1HK^O-ul|u7$O2>Q{OE++s z=4jL&Bc9V4ou;a3x`t8rg!b+c;}y;pP3f$2G?<&}w4O>ctUaMnm5M!7k{FAFuiCTn zo&NF(36_X?l{x0PkOGI~wX+<5Dx_IyoL3Ykvoc-IGtxFGW%q8E7zkC$ZMB@0Z_ypW zqe<^Lrlj-E*QF`>raW-dne~LjS~QXhhqIoq>eDYWmSoxLUJH8u`=%r7GW6I;*2ULC z(#hQ_1-RIO8 zXbugHgJmsLhJ_iAS(shdgT_V;k~wK*%eHyf#j1s>OWH3z&1)!=N+Zc>)La4me-yZf z0POFNB7AwQ0b?`5GD94_y&6rAJ@T0Bx~UEGBw-2{EVtB!jG2Evrl$&t#PBqyja>?EGiaecqNZah zg`Z|fIT@YMInBbEDm`(~n4TfJJs}|MP~IKynN*n?=L7X910c0Zazx3Igj7;Nhfr=L z(cGM@NBKJ8j)GQ9P?+dQ5lsOl1J8VNYDVDF6LfG)%{npt&3tq%H|H)uShfROHd9x0 z1JSh)6u1_ubyB9s(j4n{=Q=3B#U9A+};z{Gy;1mhH zik@+sh~+ABoF5g066Qw&KKgvE|jdp z3p5>|mIsh|FHiyf0|ARd{3nQsAjY-&2o4nm_ca zt52K9O~M7g&iqb-eOtUv!8MDf@}vaN01_gmqDJo0gGd8Q2w?>8FGV2=a0MOAyOn7@%G%9mTDS;Ea2`4rc(TZG;ZxL#kB%|IY866pa#|_tw z(Ix*gi=Jo1>E~Z(%7cu{Yg>>3$&gEv`g4$f1gmOAI}kbI!&w(ZjCcXd@`b}B!a^c8 zAX+pR0h?brh5?LPBw)e*z@^lc3zsh}`r8*h?E*+soI-;LFmg3t0QFoVt8!$-i~cv-L5s{#g;M zrKqSTS+HJ^XXUq>G^FFidyAfNQ|rzz{t>k8pE%D*DU!7KGw!u=x%aF+1GuqsV5aII zmjpwjbT>O@939UG%UA{4b5@jfLd_83RhiIeNP1=ZBzDI-bSH$!{4-}nj!JBu=#@aF z0UH92`EGT?#fgQ9tL;nGt@F+mZ}t4)m4>a?pZakB2m3!f_`$*Jq1%o{PNeSo8!mol z;X7ATOF4uHx&&NKBgL|1f;c>Mr$W7nX{>s$%-)J<6|nb3iafJ@Zr`q%uOQdU5rGq+#Ffga55RguF-@u{#59Mslt2{D|q9k zDCfIx@{EJapSh7*QZ>a&_O}?V;dXBa;5B8e{?>9$3_xbG0#5 zsN^}(lUf>FfF*G_p-(BmJ5$nq@w^(Jj6o64sl+efhK5)YYw7Ih?g(brkZ5Xrv*R1Pk0z5HZzzY9 zj#nU$N5%kFN5SZ#ALry&_kwzp%Xb{tW3i<2T9U=Iwhpmc>m=eyrd!7W_M3NrTzJ4% z!#==ejwm+IK8qKB{ zy@LGvPNyN9#&uz&*ccYmn*)cftu?Y`KtesCfwRgZj7Ug6L&(;xhnl^FMrmr;k7Q1I z5R$x&7rPg_!3`=~=lbrKSI&L=ZgtbDL#}#$&FS=4u1d~|%GFBA?OApy8JDu`>d3e{ zZpe3BJ6F8Ex#OJnWaXnFG8+yj(+RDB2DvbeljNF9$b47&uH(t+(4RUM9FL+y3y$$} z3|REsGJpT6LvzhL=A{t_td715a>}Mpv+{zJrxv@_9st)1EQ-MZo5NX-a3=m0(kekO z$kIsY6-hG&HG-o_(Xp>5VH`cCl5B!h7s6L%l<9gRrl&0W6$eI}qtWQrITIPQfPqmH zh&4G)S41HAI%E@eNHk1{dxB;OWs+Na1&S7rP3B8oGij)~B*hShUz!^>R&jfyiAXFB z(;?w64FW)-_*J}eaiL1k%xHWv$x^Tgz)mJMjmXjnOU4y04Jl>=T42}&#G;j4o`o^{ z523)19hX3{9-_rsGE5XEOea=M%cNzkI?|9s%{;`Q%#bAObB&UOR`(zXM@ea6B!M z_Xxxxznz&cWhGm1-ZBNISt$yo>o4R#lOyCe!+#c;kh#fuFI1H&hb+C08Dv-(g<)BU zt`7DL=E!>Wgpp=?*qBa4g08GfWuu_b6I1l&#F?EyGlM9iqRh<++hV!t{F&MPxP1&A zj3sePjpsvV^S`B$h~R$#wXLe=GgyD0TL}a&J#}UO<^9Wn9WV@Ee{(4iys>XF&~y8l zOrYm;n1i4DoZ6A8_&H%1ez&dL`H}lTIfUw0FqjafU$t{wL?;a>U=>7wY?>qq=4d>T4O5UPl8L(boN;xUi$Ej^ zr&N#$RXYdC3Qh%n6Ui!O${o=J99`s=f@lq3h)`QqLR{uF-SR?pDexF6Bk)P_ag1mT zv>8GTdI}R!I$?XPOlde@435B`VUV|tb!x+*Q`nOjBvw8Y5eRySm_oHrMB#erB=1TW zNs)}SsV+bkPr?NXnT{ReDq^9~O#P`#$m#(R*UA=5LJa|O-f*-^8qpH>iy28NnogtS z4{^xaIS_Fh&UN#00P`9E#=Ku*GkRmtaS}L`b2>JcNId5g;H=7c8d$?oM@`s#-9j8L zQCVsZpSjZ#B76AW_Y9ebJ4AMTt88>A$laYOmQIZ&z>EGLJTr4$>k;Dr+$oh}b^H0Q z55Rz6%jc{gBt$6PEy!g9&?bw~i+vq6e~*90MkJtYJ(6$3#ls7SukKs&DmPq<-mXPg z7at^o2KECg^M{bBnNOg*O&AK7Bzj1K>=`Nn-H^ETz!)MA&>}3)H(#uYe4s?uV%?WeV1 zR7)CU-$2XX;Geb2)sio8@wtWPE~S>dE!X=Oy`77$&eFS#Uh*38ouZHhj~TL1Awm}P zG6X18B5VP{3Yu4QBMiY~#h+MjggKOS(-65qHa^&P>{(%rl%aiUcp&rUHo#L=Q8ciffxd1cJVFa*<7YHLC zg@_?WAl{?K5Uik0n~JG5mklLakrOO&-6h@}7?Ljl$)evjAWL76OEu3aCa2j;hJ-|nLzI7 z;lCG!{{t{u4I33n+yQc1YN{%zgGK`?4sE&ljPmaAz)pQ>Dz6TfS$20!CtjnFA;Po9C1`LK~wo z7-2L&!U2?0B*T;XQ8al1mT}fIE2nI{hd+5k%DyAxwhsbxn2%)?(Rla_jJr~);~cND z+UMRm?=z6WZ!TGtH<&AfPgZNIwL#>3rz3I5e@3hjNfb&}AU#&pM$Ih?}(&CAd`6 zM%JUBkAS{`TX6#02;%~r^Gr)lC5Sznw=~Dcvu+rCaT#~f2-UqX&BI2UOmO=q^P-TA zP(pXp3@*w#F-1t?Ngj8?~9HU6=Y+5TWC_>{+hq&eU|@cHXJk_nW#+S9V?A z^@H8>eRm;AoLV?_wf+6>Yu(FDyE9F@mzuio`1aiQR$tN<4kOxXrEd3)$c@)-pZui$ z6VET?#hRDaoQ^>Cs^qAuhC*7=^cceM#e-TY(DeApe&yTq(4d?7PH$aboAjUCdY%34 z&H@7~Q5H^3b|AwULO#1d89ml*60R6-wSWV56gBH8VMRC$1(3U8>+^QmE=A0*v_>QV z>&rnysEW;Ta#3c4CpTTfyUlS85wCi-g0PO;^0SWA zuxUxjX8oC{kTi~9gW)Kp%)nt&md)PEyGhPDTYB_@vHb=>~sjj{t;@4`#hv36i zvKOdrFC|AP>7zuYgdZPWN#Sp#7$Y`INk1i9Dd9JUKw*^pGyWL^NXXIXf}_#ravzb` zd`|a(3=2Ow7;BJSYj?QoS3PC!miu*^SKWB8mPz%UtL2pQNL6jC6_l%#DytuOkrPwV z1Vl0HhfW`lyhbn;ir6GJYhFuu&b=WF3*{u#4Ev>68E$2Vdj|q`37MSa7<14r5^7+T2d(A<<$6F)DYET{loRlNMPo5j z_UH1@*G`{=1&E8XwxQnw*i^VcoOx3U?^Y0)YQ=X`nDMzN%=o4%)}ItAK?*@6lK?wO z78dj*WrJIHv?xPNb!-~uZ8HW74LI0lVBlNAip}>WM3#(VWq8Pju~ZKeZcC>dA`pbc zE}#(WF`<2p_APHGZ9x&>Vmra!xD}r7mrk?-G1*XN;6XN3RLiSk;4DU?6t)YFC{);d zrA(MlOrECb+-(hx#h2Y#Y85vBGnX?IG$B5lJNA5F3xmf6=oZ@Kkbuu;ju=w-;?q3# zjkW*|O+;gJ-y*DR!|BmcopH>v=i%EhEDj4C7=hbZEEKz;Aq&bOQVER|p_lMlL=l=E zQqDxC=rj`@DhDMJi-J9H;}s9DVz7i#1M3EHmt(>CU@h=(9Zycd>%&AypS4xC z_0v$uylE+=!n_(wlK-ANSO9r4%_8u`nYJ$u3Wd!NgBa7?2_Ps=$5ciKBDN+7+CwY} z_g!9l9z0;3HtL+)T3RE`F{TSnw8&>{7?7S>XV@fil+V{jwE}GvvC48u`C2L|uLDXx zdY(SZ$FtS3Sr_KARWh#mk_g2g{>xU(cqFu~e6=I?^n!cV4N13zo)EUnUWfPNg8MD^ zdk4jPO19)n;qRytLSL1AZ;47|UE@YFk@Zq)M$Tl*%@*tpz{b8s2{~=DwG=l2Lq!<; zTzuJ*EhiE(rW@IE(-+2$QS%`r(BhjY&n3-rlaR4_D*7IhtgIU}D$!$0NF@F^v*C0B z(YFt$SINC~h=OX|wA|Q{Y3#UBzSOv9{@BXa?H_i2&^dqXj<0n^ z=|DT*N^>jM*C`CYd!=>ja_iHX)~9c4e;xZ-Y^k+xzWr4`TmP17fvqwc4mA#|CM6*yB`{)>HJ5f_ki^2 zfr=w7&cBmuk8E)M-3B-E1u`HlpJVtXWF930me##cS^~36n+Qs^ER9Q0?#)rT>*Q$& zseKlk#C5gY*PuKmhS>Cj`^AZ%@K7A9*5Ux-jLqPnJdX)+3=!76Za~x^xIH>D0y+=E zWx3pQj?yD~L=_AVd?J!UoR>X@Ww{jk6o*K#MgAd|<*vcxoE{NyPXex@37cutWTkAV)(1U>^$~>TjPg%@_J(rdu4r?XNVf=Lus!~{ zRbyMo*Pn~K)?-OkBMT#)5I&@W!BG`{BbpBn(d3Yb-2!_cH@~3_3F*MR*Z9gQ3BJV# z!OK=+R6|G;e89&ru6;H<2xnqZ_X|{?Sy^8<`tX+ zz-sb{QHhT52OPk8!SR-3+9}>S4iI$B4E70EC4B+LqWF{yj!Q6a@aAD5F9MUtlF11Y zPlWLf&d3Pjx<+l}E(~7Do%dM;5qU*8LYN`;av)gFc}LdGhv0aS^^oP3YO@s-4-w}6 zbpo9&AhFB`2u(HcJq!Cj$_irovsHX7OGKS%DZ-6{TAh&OH4FhH@wh;!8#XOBY|k`o zUvAiyY1s9#Yq4S1Qp2J7qbmoGWPHyGB7Vo$c6}d3(*A1Ov-s|(<;zI?JBNE6(x;A! z-W|?Qy|uk<&QIIi$QO`!+wOZDNb#lKYdhGOhcj<{g!obtbzoxKRT@1WXNsqJN=1R* z!q(9vO9_Nk{65CV#~amh_Uc)A#J)6S-WV@ocASepVny`=y8QG4uE)4-V$9W)9s#A~ z-Ya@6^B}~uoX}PpG6l0W7j?(a(zD$%2~E+sq~#YqZ`Wc3`b41U$(_fv^-W)}CTFG- zGL{!=t)+|!E5i_m5q5PVB}}J;%U-o6RfjDQs>lewvd#LE2uZ}(HT=6_abs)a2v`Uw z(y^Fb&LzTsk8!N~TFxg;ooCljSa4xE2}i~i>-(6cwT_v2>jvT!ofv+>!Y-P==s32tn_4*o<-m0mFBMH=4Ug_ z&wkwg^UlBN{G|UMPJViFsrl9U{`XGa_XjS{F3c|ax2?49S#CX&X+84EzJECI>4Bxz zlb2jSBmvP^v+Qloc$*i!9pFLBzAYKwmS6dlRj1@Ly_dN5_CrX;vFzb?to^ML)uh8)Jf8KiK}b1y8!*D z)IOBD)>a?lwHMqM%JOC?aj|D@9|K5@gKdKE!BuJ zzK+e-dNuc~3to;g?&~Pe_jPa%|Nr-ed_V>JV(F|wkLm@Tfa^nu@s?n1TP$F3ODBf8 z^ATn^h%y=kR1$Gj{2c)y%aR$z7GAh#9ADa#wS^19wsD9IcO}hB7&KqDezv4+6Y2MaMBoI~U0N65l5FjF(7vxyl! zJ!%E2&a`5$a&Drc{er8AMS+!U97)j6CMZ8d$xcdQl*B3F>UtpGF=UREEysto^ev(g z>p4f+K|OX+lB9%-^OMLy{^PnonclNi5d@tuOK{8P*&nbF?kdWJmzOqn-Ig;O_s&4 znVPN}XYSPO{f&Z;{XX*D^xYo)IJKnoU#eOOD2suvf2?o&;mg0N+kB<_ayPN5zLm{w z?}x92mpAXpY~Hi9`6~+p^Dkc7f7iER*|$04+k92O<7@xS12e%&&-0g@SGr%H-<=xezQ68j`@(nbHny)cK7BiK`?Zfx{-XXDp2b&Q zU93M1-_(XW_@-*>z*lNozj&}o3T*km0u_fINd9x5AnC?9+%D>Dw|n=|e=g!lRRV0qR> zZZqNjA{{^Lgx;4eqd!HEG($N^a9(%12T)jIPsL}De@j>WRkT1vN45Wlu1jZsP-)&M zfBW^`>)MC04`RzZp2_TZW^wzoE7diZ>aVn1ZdtBv&(yXr)@;B2wHy0BI&kyAM~7}6 zy3ze{Eev&42Unf=M1~(y&@nI&tQ2+$?n>l@j2yU}*3DRcD9g|HJ%TlGM##$iZ|qn# zIS-)eQ2Y}b___wX}5|UhI}eYT4}d_ zfDAbd18&diSEOwnD;>L5y-jZa{i?cEH{LLJ*0rscQ_dsRDXSHftCZ@t^Hz|VE34P4 zP_}lU&Rx0I>2Y_j)i=A_R(rU^ahtnt?Irn%9gb_{aC}hXa*O?D1SNd8C-8c>WdvW0 z(x-&h&4$;9{?5)f`G=%$2*2!K<~p#iA}>lQXL)X)r~FR({&OUakH_%+Cv&1G>oo<2 zb1E|go1;6Bl~dUY&hrrxY4Ct}Fd-nW!AND#25jzX+qw;51edaokra5Lh&U5E7~LIM zz@wuus~I9L!be3_XJ3Ei#c<#87yG_?V&E7epZE;;^G%^CV>HS*f^lOQAzjvEDqjYp zz?7`V{AR#lByqF-lyF{6nlgKdnv|af#9vog*3)NhTGojVdc_W%rDk8Jo>+WJpY-LIv}UrTlOr1pDK>u;sqzm=NqNiFvz z<({+y|KE4IzI*tc!}naF-@2Oaxpv%hwSo0j1-^HDuHy5uugUWE&m>A$Cmo7hwNk!) z)rt3g_qH`R-m6Dt$z46y``r_7pO}wat$n}gTGREu8?_%b+-$i1Qf5>49oL>Yd97@R nykqUOyjkA8_JUk42S2Y5$t|BrNIoByhaGa|zetqw+x)))I^$lM literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28132cb473282b5511b1699a767f9334e80a44ec GIT binary patch literal 9149 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 Q#!`rJ`4(EBMCIuJ0h$WW%m4rY literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b62c5f6388907f081ce24433fa5f39920862c68b GIT binary patch literal 1867 zcmb_c&2JM&6yIHc#v9xDa2)J}WJo9_rP!i~8y`X`B@qNgjnk?d(bdK?v6t-bnAus! z_Q~p{QBS?K#~i8XrGG~+k#d1WsVbo!aw7^Sdg+^88yksZSMvDH`@OIEy*Kk`I-Qc> zdwBh%_D5WjUW-lti-m%G_LD40zet-BmauF|wyeprkQGbOBJdxvqIOJ+1-hsew-Z`I zmPq8uSU=F1S6B;0=q~WD$y1NGe4rWKAg&9E*36dafJLHb(fRjV%63hs zhN#C~6B9&tkkM#ZW;G}bRl}gARH{-pUBufBKrE|`Y+^XDuNxe-sfP^CiQV7?BTkX$ z613wvRdF=KGI=|+a|po%r+A&9s>c{{_;9Kcs!-%ot4YAxbU#Nf;mB(s!x^^f7nIsF zd0hY{`02eWFE5qQ1`+-QVOsTUND&@mhcaYSMv&=%Xa~wtC%q#G4I}VYC*R`>8n89s z^Rb`Mt4$r!0B>2(*`}U@bsP9JYJ`nIYy3n|18?~e5LiN})ZPh&pD))~5|o`+A0eBC zt?Hla|0G&42R#5nS1Oft)XP*ta7@>;_(y1>4&pF3Vjh5|)DT(7fOB(Hr+cEoMw6P* zX)zHEMz<|umpbDinY}D}6$mX35!xHLp60Qy3Q~K z=cjai$KxI&y3WKc^y6YMotiImU_Kn#romhm6<}tMu-y*vY9&kDDJEVZAKiymn#dB2anIuAsMJX~|xGHz>eQ?lEX9f%rjns_szHXWe#dEG>d(b$#e^ zLy=h#eq1aQ0uMakgn`GTQ0K%lC6+uaze#7XO7FJHn=Yg&lU=xM^(Ur-4XeDmT3IWv z-Tm@f`Kf1iY{TV*m7BzAmMwF;+-UPUb*`7LeNlEzPOdhL>MjhbTMpV&u7yuVsnLFy zylGSHS>!gm1i8c;UhR*4v0Ot#lLn#WP8fmD9Ks==V1d z9srV8y6XOBADNm5kNu5ih*=kokOn-VLt-hSQ{34n? om;w8F5$XGWq}&|ne=a-|IdUTVbRQ`!4v>OCX5Wgs*hM(?f9Y{4+5i9m literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15a829b3cd62672ba243be71dfbf34e576620bb2 GIT binary patch literal 25447 zcmd6Pd2AflnP*iWWRuN9Jake=$vViEsFrou@-UVti8@Rll-8nSn;xfG>MD{=HM==g zMNyHiwGq8f*Qp%INBW}t9qWtncf2po-xYn8_>SfiBZ4sQ~;$ejD0qM*WAZ zHE+iH3~PtA(`tA#-nSiZoeFBJQk5qDS-Y&pH)9{j+kHD8PJF>T zT8rz;yKUA%YYXb7f+tk64we62?U!}f+6o9O`hj;Jv9at%gWn0u^lUFTVxt_-n%N;L)QyeO?aa7i zj*i+6Ju)vA9gpfewv}`2ESI0P-BG}?f2~X4ne63^WBK;CqRY%43*oxftZMm0@eeielqn&&?o1_iDB3`_b7 z-?#J+sH^x~)x1hk(zGeT*TdI_>OVL5wE5$Ari}_MKUmWMvj$TGhnkeIo zm-avB+K#*5zGN2Mp<#61%%wEEZy8CHKFYO<)^S~)LJvvdUL)#giIa=;PXA7Ea!GHH4F4NlQ z2`yQBZO`nUYw6ka%`FSnt%Gx~1TkE(v0oZH(ux1n<(d3-K*d>L

q+DU2Sp`eT?#W5{$3E9VNl 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 WdN6$DVepNo0S#+UV?%gAIrV>?mP~X2 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85e1a5357e00b4e347966acd83142e942cd5c1aa GIT binary patch literal 17135 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 ZlTc8UpERqY_}qH$zz^_~SCOCl{{RHCWa|I` literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..090d3098e6e28a216ceef37ce5e80d901517f741 GIT binary patch literal 1224 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 MX=4viV`jqt0^}*=Jpcdz literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05815c3d2bd0d558f70112275a952f8998c5b8c4 GIT binary patch literal 13599 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 B;rjpp literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb5b6dc95638d5b85c863718477f6d6c2a3aa492 GIT binary patch literal 3990 zcmbVO%~KO;8t+cO`GgQcJ_r#ZD(C>33|}&Wh=`5?@MAY4}V zVmwJs2`A#oP_tFCr*%*B2h644tv#f=$||eoG`CoDo6|m>q?44}LETi*{r2Zsrl=gnQ5?-vTXdMF)wO{)gc;0iTD0)S zTj&Bm!yC6uVN)d*@#ZZ{*iu;=dFz%fY@;d2^)_;}6=%Zj*p55E+o#zY?;co!C(y8H zE6CE#h#G1+XSK-28@Hd}v#Y+SS$&4P^tl3NN3Dhnw{zwyR+Opaxb<^5OH2OlI@jR_ zM{R`x0oNib%&I6}eH7dU@m<(ktEjHKo7do}C;f#+m-!_LHG% z3Hu@Ha>J{wsw#wgTd-j^r?tq&8~bB4_SbuE6~Sy?ZRBVx?5}80+1qM`aQ~NJ$6$U> zLXN3w=-_fqh&9~6m*GORo_@YYKMqo$}e4?+ILEGW*NQ)Z!CqcWD^-jqrFe{VQz`Y2#pS}AKtD`R5P`;`XEql<< z(w$J;bjoY`UiuP_FasyDsmzGZ$>kD^oEi5m7e_QET2NxC}VJ^5W#^Tk=-P>4r zyo=MZAje9qC<*C^T1~8gE55o{WD{aM83a#*p<-N1KxYaAX~1Yl!lHusxF{*id}2p2 z-(^!3DwahF3#^nB8h!l0@@cFXrF4qNN?TQes?G8MKS|?61S{<|WvX^2o{$umro##b zmWiszyb5jozzPEVGes$udnr|JmRFo0^gZDQ0Hp*-UdB6$Wr5{+b^|c2^V@7(sw~~} zQQ)_t!irKoz<&crlLG!WE{M{{K2O#6u^Dmkh@_l;@Cft#LNX!Yr_y~P8Ns5M6zX;D zH&_whdK$qMno8#?W(6*}ou~%{R`FJfXC>USgjb9BHqHa{dS=~zn@?`AeBF*Vl1W~1 zYgwz!ZFa4#e0LK^*)-p1y%%g1Y3~al-Ny~MZwW$DxWgtmz6smDl1u~Tn!HEU@30rt zAK}m%OtTomk70ZsZN?KE%ZC;hSMP@I&fgpjJxRxRw_xb75c&}(ehl&PjZkVwdX!9z z2S>+3VqC(PQf%Zg8^dBK3ZwrxRGsc%YUdBj)vY9#=J7Q_z0hd*6Mb-4$_!1@@2IoC zQeE#E^nC7bbMH{_9SXfeqh%B2?8=$5<`U{CA$VF#$dYls^t|xwEx$*`=ZkxbnaKWV zZZbQW*(9i^1h%EUrHr_DPg|x5@{}EBWA_Kf>NGsFm;IEZ^JVNsY(J8pC@=?C3b?p% z>?+=Qm6W}cq~r3lHh}GPzTAGXT|#!XOciBD?&u?^zg~C$L4HK`3=+qAf-aPe2IJ5N z26Y;qwU;}nZeK2zjg^oSC}%F^du7`oLFcOC^wP2SWmk0_r zo9NeVuiA=tNnl!bOcOK%Y8z)iFpLjC++_>Z*MIo%;Gx!(us@M`N{}yq=5Y96xUf=m zzBzSt>Ufn5P0NGR#6KgWnGcMi50d?$Qjh=8d;r^066V-^dCFVFE3 z3C+nPb0lzGrcRe!?%Y&%O6!u&*|N6$Ea@DQ9mB<&vg2!lM)jTZZ_jXab8)8X2|THZ!n=VZq@f(AbBNh&OWOr9f8VTtsI zi0kVr1GV-zlpcW60VwT1b?86vH^ugZWXf9t3H8jdx4YTh!nuM}7$V&lVXsOaZ!Vk- z7hDCdIDSn3)A$c#ahjaJEC;6Ey5+zu@m!Osu2O$MmAGUyJrD1N_nE!*eKxn5-7L5Z zk>co^$)m}_COI=oykjyNKVFs571+)IQ0y(cDPK?XK+!p4)|lCreIv4CgrJKJNh|g| zeb{!;CJ#&z-#4=38-lK=9m90gM$1+|y0s%IyD!L&3j}?o2`KK*=a#d}a$uaeCuGM2 TL6d5UDJbDI?Ae70xFP-vd#6}x literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecfcc53e076b51f7f70e47f4955b4dec6bcf25b6 GIT binary patch literal 7020 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2bed5713671d12e969ad1657aa2464cbe826216 GIT binary patch literal 10055 zcmeHNU2I!NcD|Q?qC`rhM9EfUN4oN#ELo!DpS2w|-mK#&wqje(%1V>4ySTjK9f_1k zUS{s4WwB1+&8AqnK)Xp6i!9Ir^}fYOANHX@U)sL)sX#$RyO2THg^Nudg1%^Drw!bf zerN6vX-RhC76rCIZ{o|Dxie>G&N=g)Gw0}^T3cHrJQt3BG5-(yBCaxmXi2&bAwIfQacDuQy89?nM# zt*KT~ZqBzAVyT!Yx8&o6_EftpG5-Qqviad5%oWKe3Z1D=S@KC|B|Z9{q_?u>PyBY@ zR9LjOp*6-LUTe#;Z!rD^bs3av5v^D>EX~RpMRN-EmKQaBn!QzKriEJTxtW<)C$45# zi8`R6ss1fI&CC);u`gtsRA9jreIl7M=d5U{TB(E~U8-5i=PY$LUuGqqLwiZHviJ~~ zF6UXsUaI{L*gx|9cR=zd;4qU?vM!~3uYuDkKMSOSx{rl)|MTdm2U1OX5Vep~3+qj& zg`HZn-i%s{Q)|&9s70MxMATZHT2$29sK#3Lo)u|M)?@EQKd~1hrP^5ALa$S4_|bRi z@%I7^z1*?w4P)ah{+O{H4P)cpyorXf?X3MVV>=thwqxvWy{n<6L$vH@Xi1>uS$$_i zOQ+r|_SyYjG}Wc|iSjcj?^uzp%Bh`~r9p*|Fg%6Uu46_uCsnz@)%lxbFAg;~Z;#mcf41y4bBq*86QdYC5v#FFzie@U~8IU%|)9=iQDV(LGG1ugrvTT% zwTwL}Cf|0^)IXyY6|+1m$YPb4l2&9gODtksvn=k-W^c=xQx!wfG#BV_kBGDUZ5Tzg z>l;{Ne6hmH^T{QS!vP*8o%59TNYPTnGD_UIlG7Q+=ktm&N8D6sWx3h1h1S;{QY3<0 z5e=n$ndX`UTg93M5wpZHxw%|MG0-I`njQwN&t&KXN6KzDL3eV4E} zaHP@Bww0`Adh{@7I(^1gjgbpNHPUG%3yy)EbW&;H>zB_?;>dE)S9AmHg&6}3L0>hC zp@(K4W@00@W-(sK74b!&k^+ThS^+wpWkuSeu34Jk2T29{*RB{jY_kZ0I9xfazE^vs zbKZ&ggqF#AyKvwTlNe%=<3xBoeev`g>X}PZGZRxY>V=7^voq(?3RHhCH$M!p%Vo0O z)*A`9yn=Wv0a;KRl8;e@0(b{Iopx9V7SYNfg=LQ%G0GO7SPBjsNSC9xxSX6464*qg{lax{yvhN+uPE$%G4$$!f)U zrjL&+N0Wy=veZYcgn-#u2GDWDJrlNZcpRm%Ds&#AwS|NL$TfSPrWcj&TvuaxjRW%7&lFiuYGR}s9r-NQvmWbTjrCXe9AAx{sD@A62LUPLK_x0w z7Qowq0$>+_siI^*%hD|w?xf)0Egydtt+n744KAR~6ovPp=^NMn20ED}fa}t|y$4qU zzX>Z`LG}040{jX*nQ5>9WWC5WvhiOlE(2?dBXc?EBN;hmF2`{03L1`?=%;yloK6?u zR^`atjZ)VU0ur3?SwmkIaQ#Hn;E{Q16QOKx8a#r87EfU!oa5F27>;SEpXhIkpD$mU zzNlWDxOi#$P4)6*YU0}==y%4()UmO#G@Qk652D^~1(*sT{~v*m=yg%w2$A7tWagKTaM_t#doqjPIgOyYX_c&OX)yXsGONgrvAEwe>(&^{Pg(q zf82?CO8jZ_@JDbJ$g=~dtO0r2Jme9#zsF$CAq=YQ*n&A?$PyjfN71HlHPTm&91>_V zu$maCMhEI>GgyrdHlWRs)!5N$_~?HdZNz@Ipv{vO{O1ig)3=XsX7^T{p)JyU}|9tT%yVV4mw z9OTHF#CXSKBvGuyU9EFFen`Fg@q)+Q3FG$DQ#VdkBm1CiAD#N()OuoYH9;zNFP7LU zRY=s9>Z>R`PO5Lq*W@2{>%MF96^VCVlNV^zrbqXELJP&C`|TJ7q#Mu{9O-g4pQAem zwp}D{I1wf%cB^>N+Rbv>Ip?Ess$#NUr z@b3RbmSLu;@f>chg0hgd*dMLYTLB`5^>9N5u>cEfAe9nsA{oT2b_M;RoeBbH_$t=i zz%!wL^}RuX=DXtgYNuyT6_acdEr0?dLk5B&c((S~q^~8bI#DSaUTH?^hr&klnYBc#| zWjhIiPg1t)zIh6Td1`h|c9jdEFS+t>GXfPJ(I`X)?4acql|oo|N#h9bI+t=!v|tUf z(A#Tc4B-)U!6|2jlC_NBh6#^F%)@boBGps2%tx~G=Gb2E8nnC~tk85s+YqWak{oLY zRzQ-(ejdRKWpT9)kklWMVM~1zm5wb!H2(&JO>#yBLc}|N`p%7aRs#1Tv6bg|TK4`M3`|uL+gxfn&4_GJFJjvWrKzl# zv6f3r6&F!e44@eFVA#Hf#MHc@>2{2m?!-=bMrX6-`C7P;D=->e3(_UqtVKn8mgNB> zCdV$MLBEigD09l{n55H+a^1eU&^f5=bmg^au79NNm+(R)Az@7Lk}uUe$m z?mO{a>+$|iyq#PDGDUv=0+L&Z5cP7!MzP~-Y4;aw|$l;VcuRZZzo?azbjcz zYO}66*L?5#bm?v1JH91(NxJHPQ(BVk>r>E{#13Q+L<)ffLVL#Ktm zXw!KCKb7`Bq|n!d2)o+}5J8ByQJ?NwSXBu?RJGQkIvE+1qpJE=S<5?Lnp9OcGOEg( zF^0$RLS95|$ll@;xhuS#UbIU)d?~KFw{UNea=U;l~pJ6}sM3>($cd;R?T zU2B17QGT}n`ni?GwSck_mWGnoC#$goYk`rCs5E-C8tAI-JhT=#a__)UHL&v+J!^rX z+XsiMfoFa(z7`n1z30I7OYf)F0tfB|TOas(f+z3$rBK@jl{QXFq3-oy?`p93OP?GZ zq%VCNRN4rk&jVj)aNOyQ(#Eh9>RAset3ic&AEGb))ccUv`Am)s)qx)B)bFmFO< z?XTgK*hbq<;=74m;p@YWJ|V&Ty1^GsSl&g7s@s_ngbu`?0=QJ>xKXHQD3P!v)9eHe zg=Yl=es1O>+&>4f5h4{9+R1+)wfp@t;@)r}kRKE|Ufn1TShib+T!!tlVSdncQqq)= zr2ss>;URbIJ#X$tw|Qptb|4h9K7#!X4N z%N_P4=w9cXY>+MdxpLm4w?tVoq|PXvOJwFL0t|o?k&}m!GpfaUri%PIARoW#h{C)>*YR@>brD)a^jIFwX(>T8+^>mjJeyb z=Wo5F&a`uyoMcX&6^PAwJahB^$h*NVIJte2el2F_vb;6Gn33OR$4x{mH@1n#TO+vN z$AC)r;}-Jo_-c~ffHnTAO^WWkljvPf>|agnuO2`K>0~u}@|)K2zXBMH@|S2y6Z9f*<7eqLMK6kGG#I&ETG=u(2L7TbgTE6n>;$uFCxiJU^`*7) z^Ypram$;ofW{Hqaz}>&l2lCp5S&G3d?UDA4Rs)^yFRTTU_d0f5KYwq}KsC@OY)eaU zKp^@97_b2wnu*e27n$d|GQ0$sYEFJ*Ed*~9r=liXwZt}wc-t8w->TN`eRkz6@V*vt z9G@4FXccR%MP0U2Q_bc@t!X}Q%xZbl_II0HmzFLewbq$8U!73ToSQgvesbz;E$+?a z{0Rof-!VwHBzq^6cY7Fq-u}Cf?{W=QGUO(SV#6=X@?B}qZ>5gUrJ=jh$X)5!UFrDe wQpa6MxhoCb^9O$N!n-fr4eWmqn)J&DR~8>g^!wnA&|Z09<=R&ge#A8Y1)y<=iU0rr literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/app.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/app.py new file mode 100644 index 00000000..905b2477 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/app.py @@ -0,0 +1,1536 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import sys +import typing as t +import weakref +from datetime import timedelta +from inspect import iscoroutinefunction +from itertools import chain +from types import TracebackType +from urllib.parse import quote as _url_quote + +import click +from werkzeug.datastructures import Headers +from werkzeug.datastructures import ImmutableDict +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.exceptions import HTTPException +from werkzeug.exceptions import InternalServerError +from werkzeug.routing import BuildError +from werkzeug.routing import MapAdapter +from werkzeug.routing import RequestRedirect +from werkzeug.routing import RoutingException +from werkzeug.routing import Rule +from werkzeug.serving import is_running_from_reloader +from werkzeug.wrappers import Response as BaseResponse +from werkzeug.wsgi import get_host + +from . import cli +from . import typing as ft +from .ctx import AppContext +from .ctx import RequestContext +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import g +from .globals import request +from .globals import request_ctx +from .globals import session +from .helpers import get_debug_flag +from .helpers import get_flashed_messages +from .helpers import get_load_dotenv +from .helpers import send_from_directory +from .sansio.app import App +from .sansio.scaffold import _sentinel +from .sessions import SecureCookieSessionInterface +from .sessions import SessionInterface +from .signals import appcontext_tearing_down +from .signals import got_request_exception +from .signals import request_finished +from .signals import request_started +from .signals import request_tearing_down +from .templating import Environment +from .wrappers import Request +from .wrappers import Response + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIEnvironment + + from .testing import FlaskClient + from .testing import FlaskCliRunner + from .typing import HeadersValue + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class Flask(App): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + default_config = ImmutableDict( + { + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": None, + "SECRET_KEY": None, + "SECRET_KEY_FALLBACKS": None, + "PERMANENT_SESSION_LIFETIME": timedelta(days=31), + "USE_X_SENDFILE": False, + "TRUSTED_HOSTS": None, + "SERVER_NAME": None, + "APPLICATION_ROOT": "/", + "SESSION_COOKIE_NAME": "session", + "SESSION_COOKIE_DOMAIN": None, + "SESSION_COOKIE_PATH": None, + "SESSION_COOKIE_HTTPONLY": True, + "SESSION_COOKIE_SECURE": False, + "SESSION_COOKIE_PARTITIONED": False, + "SESSION_COOKIE_SAMESITE": None, + "SESSION_REFRESH_EACH_REQUEST": True, + "MAX_CONTENT_LENGTH": None, + "MAX_FORM_MEMORY_SIZE": 500_000, + "MAX_FORM_PARTS": 1_000, + "SEND_FILE_MAX_AGE_DEFAULT": None, + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + "PROVIDE_AUTOMATIC_OPTIONS": True, + } + ) + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class: type[Request] = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class: type[Response] = Response + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface: SessionInterface = SecureCookieSessionInterface() + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike[str] | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike[str] | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_url_path=static_url_path, + static_folder=static_folder, + static_host=static_host, + host_matching=host_matching, + subdomain_matching=subdomain_matching, + template_folder=template_folder, + instance_path=instance_path, + instance_relative_config=instance_relative_config, + root_path=root_path, + ) + + #: The Click command group for registering CLI commands for this + #: object. The commands are available from the ``flask`` command + #: once the application has been discovered and blueprints have + #: been registered. + self.cli = cli.AppGroup() + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert ( + bool(static_host) == host_matching + ), "Invalid static_host/host_matching combination" + # Use a weakref to avoid creating a reference cycle between the app + # and the view function (see #3761). + self_ref = weakref.ref(self) + self.add_url_rule( + f"{self.static_url_path}/", + endpoint="static", + host=static_host, + view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 + ) + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value # type: ignore[no-any-return] + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource( + self, resource: str, mode: str = "rb", encoding: str | None = None + ) -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is supported, + valid values are ``"r"`` (or ``"rt"``) and ``"rb"``. + :param encoding: Open the file with this encoding when opening in text + mode. This is ignored when opening in binary mode. + + .. versionchanged:: 3.1 + Added the ``encoding`` parameter. + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + path = os.path.join(self.root_path, resource) + + if mode == "rb": + return open(path, mode) # pyright: ignore + + return open(path, mode, encoding=encoding) + + def open_instance_resource( + self, resource: str, mode: str = "rb", encoding: str | None = "utf-8" + ) -> t.IO[t.AnyStr]: + """Open a resource file relative to the application's instance folder + :attr:`instance_path`. Unlike :meth:`open_resource`, files in the + instance folder can be opened for writing. + + :param resource: Path to the resource relative to :attr:`instance_path`. + :param mode: Open the file in this mode. + :param encoding: Open the file with this encoding when opening in text + mode. This is ignored when opening in binary mode. + + .. versionchanged:: 3.1 + Added the ``encoding`` parameter. + """ + path = os.path.join(self.instance_path, resource) + + if "b" in mode: + return open(path, mode) + + return open(path, mode, encoding=encoding) + + def create_jinja_environment(self) -> Environment: + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] + + if auto_reload is None: + auto_reload = self.debug + + options["auto_reload"] = auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=self.url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g, + ) + rv.policies["json.dumps_function"] = self.json.dumps + return rv + + def create_url_adapter(self, request: Request | None) -> MapAdapter | None: + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionchanged:: 3.1 + If :data:`SERVER_NAME` is set, it does not restrict requests to + only that domain, for both ``subdomain_matching`` and + ``host_matching``. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + + .. versionchanged:: 0.9 + This can be called outside a request when the URL adapter is created + for an application context. + + .. versionadded:: 0.6 + """ + if request is not None: + if (trusted_hosts := self.config["TRUSTED_HOSTS"]) is not None: + request.trusted_hosts = trusted_hosts + + # Check trusted_hosts here until bind_to_environ does. + request.host = get_host(request.environ, request.trusted_hosts) # pyright: ignore + subdomain = None + server_name = self.config["SERVER_NAME"] + + if self.url_map.host_matching: + # Don't pass SERVER_NAME, otherwise it's used and the actual + # host is ignored, which breaks host matching. + server_name = None + elif not self.subdomain_matching: + # Werkzeug doesn't implement subdomain matching yet. Until then, + # disable it by forcing the current subdomain to the default, or + # the empty string. + subdomain = self.url_map.default_subdomain or "" + + return self.url_map.bind_to_environ( + request.environ, server_name=server_name, subdomain=subdomain + ) + + # Need at least SERVER_NAME to match/build outside a request. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + return None + + def raise_routing_exception(self, request: Request) -> t.NoReturn: + """Intercept routing exceptions and possibly do something else. + + In debug mode, intercept a routing redirect and replace it with + an error if the body will be discarded. + + With modern Werkzeug this shouldn't occur, since it now uses a + 308 status which tells the browser to resend the method and + body. + + .. versionchanged:: 2.1 + Don't intercept 307 and 308 redirects. + + :meta private: + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.routing_exception.code in {307, 308} + or request.method in {"GET", "HEAD", "OPTIONS"} + ): + raise request.routing_exception # type: ignore[misc] + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def update_template_context(self, context: dict[str, t.Any]) -> None: + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + names: t.Iterable[str | None] = (None,) + + # A template may be rendered outside a request context. + if request: + names = chain(names, reversed(request.blueprints)) + + # The values passed to render_template take precedence. Keep a + # copy to re-apply after all context functions. + orig_ctx = context.copy() + + for name in names: + if name in self.template_context_processors: + for func in self.template_context_processors[name]: + context.update(self.ensure_sync(func)()) + + context.update(orig_ctx) + + def make_shell_context(self) -> dict[str, t.Any]: + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {"app": self, "g": g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + def run( + self, + host: str | None = None, + port: int | None = None, + debug: bool | None = None, + load_dotenv: bool = True, + **options: t.Any, + ) -> None: + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :doc:`/deploying/index` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Ignore this call so that it doesn't start another server if + # the 'flask run' command is used. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + if not is_running_from_reloader(): + click.secho( + " * Ignoring a call to 'app.run()' that would block" + " the current 'flask' CLI command.\n" + " Only call 'app.run()' in an 'if __name__ ==" + ' "__main__"\' guard.', + fg="red", + ) + + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, env var overrides existing value + if "FLASK_DEBUG" in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + server_name = self.config.get("SERVER_NAME") + sn_host = sn_port = None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + if not host: + if sn_host: + host = sn_host + else: + host = "127.0.0.1" + + if port or port == 0: + port = int(port) + elif sn_port: + port = int(sn_port) + else: + port = 5000 + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.debug, self.name) + + from werkzeug.serving import run_simple + + try: + run_simple(t.cast(str, host), port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: + """Creates a test client for this application. For information + about unit testing head over to :doc:`/testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from .testing import FlaskClient as cls + return cls( # type: ignore + self, self.response_class, use_cookies=use_cookies, **kwargs + ) + + def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from .testing import FlaskCliRunner as cls + + return cls(self, **kwargs) # type: ignore + + def handle_http_exception( + self, e: HTTPException + ) -> HTTPException | ft.ResponseReturnValue: + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPException`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + return e + + handler = self._find_error_handler(e, request.blueprints) + if handler is None: + return e + return self.ensure_sync(handler)(e) # type: ignore[no-any-return] + + def handle_user_exception( + self, e: Exception + ) -> HTTPException | ft.ResponseReturnValue: + """This method is called whenever an exception occurs that + should be handled. A special case is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded to the + :meth:`handle_http_exception` method. This function will either + return a response value or reraise the exception with the same + traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the + bad key in debug mode rather than a generic bad request + message. + + .. versionadded:: 0.7 + """ + if isinstance(e, BadRequestKeyError) and ( + self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] + ): + e.show_exception = True + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e, request.blueprints) + + if handler is None: + raise + + return self.ensure_sync(handler)(e) # type: ignore[no-any-return] + + def handle_exception(self, e: Exception) -> Response: + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_info = sys.exc_info() + got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) + propagate = self.config["PROPAGATE_EXCEPTIONS"] + + if propagate is None: + propagate = self.testing or self.debug + + if propagate: + # Re-raise if called with an active exception, otherwise + # raise the passed in exception. + if exc_info[1] is e: + raise + + raise e + + self.log_exception(exc_info) + server_error: InternalServerError | ft.ResponseReturnValue + server_error = InternalServerError(original_exception=e) + handler = self._find_error_handler(server_error, request.blueprints) + + if handler is not None: + server_error = self.ensure_sync(handler)(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception( + self, + exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), + ) -> None: + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error( + f"Exception on {request.path} [{request.method}]", exc_info=exc_info + ) + + def dispatch_request(self) -> ft.ResponseReturnValue: + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = request_ctx.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule: Rule = req.url_rule # type: ignore[assignment] + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if ( + getattr(rule, "provide_automatic_options", False) + and req.method == "OPTIONS" + ): + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] + + def full_dispatch_request(self) -> Response: + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self._got_first_request = True + + try: + request_started.send(self, _async_wrapper=self.ensure_sync) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request( + self, + rv: ft.ResponseReturnValue | HTTPException, + from_error_handler: bool = False, + ) -> Response: + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send( + self, _async_wrapper=self.ensure_sync, response=response + ) + except Exception: + if not from_error_handler: + raise + self.logger.exception( + "Request finalizing failed with an error while handling an error" + ) + return response + + def make_default_options_response(self) -> Response: + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = request_ctx.url_adapter + methods = adapter.allowed_methods() # type: ignore[union-attr] + rv = self.response_class() + rv.allow.update(methods) + return rv + + def ensure_sync(self, func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Ensure that the function is synchronous for WSGI workers. + Plain ``def`` functions are returned as-is. ``async def`` + functions are wrapped to run and wait for the response. + + Override this method to change how the app runs async views. + + .. versionadded:: 2.0 + """ + if iscoroutinefunction(func): + return self.async_to_sync(func) + + return func + + def async_to_sync( + self, func: t.Callable[..., t.Coroutine[t.Any, t.Any, t.Any]] + ) -> t.Callable[..., t.Any]: + """Return a sync function that will run the coroutine function. + + .. code-block:: python + + result = app.async_to_sync(func)(*args, **kwargs) + + Override this method to change how the app converts async code + to be synchronously callable. + + .. versionadded:: 2.0 + """ + try: + from asgiref.sync import async_to_sync as asgiref_async_to_sync + except ImportError: + raise RuntimeError( + "Install Flask with the 'async' extra in order to use async views." + ) from None + + return asgiref_async_to_sync(func) + + def url_for( + self, + /, + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, + ) -> str: + """Generate a URL to the given endpoint with the given values. + + This is called by :func:`flask.url_for`, and can be called + directly as well. + + An *endpoint* is the name of a URL rule, usually added with + :meth:`@app.route() `, and usually the same name as the + view function. A route defined in a :class:`~flask.Blueprint` + will prepend the blueprint's name separated by a ``.`` to the + endpoint. + + In some cases, such as email messages, you want URLs to include + the scheme and domain, like ``https://example.com/hello``. When + not in an active request, URLs will be external by default, but + this requires setting :data:`SERVER_NAME` so Flask knows what + domain to use. :data:`APPLICATION_ROOT` and + :data:`PREFERRED_URL_SCHEME` should also be configured as + needed. This config is only used when not in an active request. + + Functions can be decorated with :meth:`url_defaults` to modify + keyword arguments before the URL is built. + + If building fails for some reason, such as an unknown endpoint + or incorrect values, the app's :meth:`handle_url_build_error` + method is called. If that returns a string, that is returned, + otherwise a :exc:`~werkzeug.routing.BuildError` is raised. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it + is external. + :param _external: If given, prefer the URL to be internal + (False) or require it to be external (True). External URLs + include the scheme and domain. When not in an active + request, URLs are external by default. + :param values: Values to use for the variable parts of the URL + rule. Unknown keys are appended as query string arguments, + like ``?a=b&c=d``. + + .. versionadded:: 2.2 + Moved from ``flask.url_for``, which calls this method. + """ + req_ctx = _cv_request.get(None) + + if req_ctx is not None: + url_adapter = req_ctx.url_adapter + blueprint_name = req_ctx.request.blueprint + + # If the endpoint starts with "." and the request matches a + # blueprint, the endpoint is relative to the blueprint. + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = f"{blueprint_name}{endpoint}" + else: + endpoint = endpoint[1:] + + # When in a request, generate a URL without scheme and + # domain by default, unless a scheme is given. + if _external is None: + _external = _scheme is not None + else: + app_ctx = _cv_app.get(None) + + # If called by helpers.url_for, an app context is active, + # use its url_adapter. Otherwise, app.url_for was called + # directly, build an adapter. + if app_ctx is not None: + url_adapter = app_ctx.url_adapter + else: + url_adapter = self.create_url_adapter(None) + + if url_adapter is None: + raise RuntimeError( + "Unable to build URLs outside an active request" + " without 'SERVER_NAME' configured. Also configure" + " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" + " needed." + ) + + # When outside a request, generate a URL with scheme and + # domain by default. + if _external is None: + _external = True + + # It is an error to set _scheme when _external=False, in order + # to avoid accidental insecure URLs. + if _scheme is not None and not _external: + raise ValueError("When specifying '_scheme', '_external' must be True.") + + self.inject_url_defaults(endpoint, values) + + try: + rv = url_adapter.build( # type: ignore[union-attr] + endpoint, + values, + method=_method, + url_scheme=_scheme, + force_external=_external, + ) + except BuildError as error: + values.update( + _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external + ) + return self.handle_url_build_error(error, endpoint, values) + + if _anchor is not None: + _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") + rv = f"{rv}#{_anchor}" + + return rv + + def make_response(self, rv: ft.ResponseReturnValue) -> Response: + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``list`` + A list that will be jsonify'd before being returned. + + ``generator`` or ``iterator`` + A generator that returns ``str`` or ``bytes`` to be + streamed as the response. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 2.2 + A generator will be converted to a streaming response. + A list will be converted to a JSON response. + + .. versionchanged:: 1.1 + A dict will be converted to a JSON response. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status: int | None = None + headers: HeadersValue | None = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv # type: ignore[misc] + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv # pyright: ignore + else: + rv, status = rv # type: ignore[assignment,misc] + # other sized tuples are not allowed + else: + raise TypeError( + "The view function did not return a valid response tuple." + " The tuple must have the form (body, status, headers)," + " (body, status), or (body, headers)." + ) + + # the body must not be None + if rv is None: + raise TypeError( + f"The view function for {request.endpoint!r} did not" + " return a valid response. The function either returned" + " None or ended without a return statement." + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, cabc.Iterator): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class( + rv, + status=status, + headers=headers, # type: ignore[arg-type] + ) + status = headers = None + elif isinstance(rv, (dict, list)): + rv = self.json.response(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type( + rv, # type: ignore[arg-type] + request.environ, + ) + except TypeError as e: + raise TypeError( + f"{e}\nThe view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it" + f" was a {type(rv).__name__}." + ).with_traceback(sys.exc_info()[2]) from None + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it was a" + f" {type(rv).__name__}." + ) + + rv = t.cast(Response, rv) + # prefer the status if it was provided + if status is not None: + if isinstance(status, (str, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.update(headers) + + return rv + + def preprocess_request(self) -> ft.ResponseReturnValue | None: + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + names = (None, *reversed(request.blueprints)) + + for name in names: + if name in self.url_value_preprocessors: + for url_func in self.url_value_preprocessors[name]: + url_func(request.endpoint, request.view_args) + + for name in names: + if name in self.before_request_funcs: + for before_func in self.before_request_funcs[name]: + rv = self.ensure_sync(before_func)() + + if rv is not None: + return rv # type: ignore[no-any-return] + + return None + + def process_response(self, response: Response) -> Response: + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = request_ctx._get_current_object() # type: ignore[attr-defined] + + for func in ctx._after_request_functions: + response = self.ensure_sync(func)(response) + + for name in chain(request.blueprints, (None,)): + if name in self.after_request_funcs: + for func in reversed(self.after_request_funcs[name]): + response = self.ensure_sync(func)(response) + + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + + return response + + def do_teardown_request( + self, + exc: BaseException | None = _sentinel, # type: ignore[assignment] + ) -> None: + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for name in chain(request.blueprints, (None,)): + if name in self.teardown_request_funcs: + for func in reversed(self.teardown_request_funcs[name]): + self.ensure_sync(func)(exc) + + request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def do_teardown_appcontext( + self, + exc: BaseException | None = _sentinel, # type: ignore[assignment] + ) -> None: + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for func in reversed(self.teardown_appcontext_funcs): + self.ensure_sync(func)(exc) + + appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def app_context(self) -> AppContext: + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ: WSGIEnvironment) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with app.test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error: BaseException | None = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if "werkzeug.debug.preserve_context" in environ: + environ["werkzeug.debug.preserve_context"](_cv_app.get()) + environ["werkzeug.debug.preserve_context"](_cv_request.get()) + + if error is not None and self.should_ignore_error(error): + error = None + + ctx.pop(error) + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app`, which can be + wrapped to apply middleware. + """ + return self.wsgi_app(environ, start_response) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/blueprints.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/blueprints.py new file mode 100644 index 00000000..b6d4e433 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/blueprints.py @@ -0,0 +1,128 @@ +from __future__ import annotations + +import os +import typing as t +from datetime import timedelta + +from .cli import AppGroup +from .globals import current_app +from .helpers import send_from_directory +from .sansio.blueprints import Blueprint as SansioBlueprint +from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa +from .sansio.scaffold import _sentinel + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +class Blueprint(SansioBlueprint): + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike[str] | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike[str] | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict[str, t.Any] | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore + ) -> None: + super().__init__( + name, + import_name, + static_folder, + static_url_path, + template_folder, + url_prefix, + subdomain, + url_defaults, + root_path, + cli_group, + ) + + #: The Click command group for registering CLI commands for this + #: object. The commands are available from the ``flask`` command + #: once the application has been discovered and blueprints have + #: been registered. + self.cli = AppGroup() + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value # type: ignore[no-any-return] + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource( + self, resource: str, mode: str = "rb", encoding: str | None = "utf-8" + ) -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for reading. The + blueprint-relative equivalent of the app's :meth:`~.Flask.open_resource` + method. + + :param resource: Path to the resource relative to :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is supported, + valid values are ``"r"`` (or ``"rt"``) and ``"rb"``. + :param encoding: Open the file with this encoding when opening in text + mode. This is ignored when opening in binary mode. + + .. versionchanged:: 3.1 + Added the ``encoding`` parameter. + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + path = os.path.join(self.root_path, resource) + + if mode == "rb": + return open(path, mode) # pyright: ignore + + return open(path, mode, encoding=encoding) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/cli.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/cli.py new file mode 100644 index 00000000..dd03f3c5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/cli.py @@ -0,0 +1,1133 @@ +from __future__ import annotations + +import ast +import collections.abc as cabc +import importlib.metadata +import inspect +import os +import platform +import re +import sys +import traceback +import typing as t +from functools import update_wrapper +from operator import itemgetter +from types import ModuleType + +import click +from click.core import ParameterSource +from werkzeug import run_simple +from werkzeug.serving import is_running_from_reloader +from werkzeug.utils import import_string + +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_load_dotenv + +if t.TYPE_CHECKING: + import ssl + + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + from .app import Flask + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(module: ModuleType) -> Flask: + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ("app", "application"): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + "Detected multiple Flask applications in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify the correct one." + ) + + # Search for app factory functions. + for attr_name in ("create_app", "make_app"): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = app_factory() + + if isinstance(app, Flask): + return app + except TypeError as e: + if not _called_with_wrong_args(app_factory): + raise + + raise NoAppException( + f"Detected factory '{attr_name}' in module '{module.__name__}'," + " but could not call it without arguments. Use" + f" '{module.__name__}:{attr_name}(args)'" + " to specify arguments." + ) from e + + raise NoAppException( + "Failed to find Flask application or factory in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify one." + ) + + +def _called_with_wrong_args(f: t.Callable[..., Flask]) -> bool: + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param f: The function that was called. + :return: ``True`` if the call failed. + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(module: ModuleType, app_name: str) -> Flask: + """Check if the given string is a variable name or a function. Call + a function to get the app instance, or return the variable directly. + """ + from . import Flask + + # Parse app_name as a single expression to determine if it's a valid + # attribute name or function call. + try: + expr = ast.parse(app_name.strip(), mode="eval").body + except SyntaxError: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) from None + + if isinstance(expr, ast.Name): + name = expr.id + args = [] + kwargs = {} + elif isinstance(expr, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expr.func, ast.Name): + raise NoAppException( + f"Function reference must be a simple name: {app_name!r}." + ) + + name = expr.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expr.args] + kwargs = { + kw.arg: ast.literal_eval(kw.value) + for kw in expr.keywords + if kw.arg is not None + } + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise NoAppException( + f"Failed to parse arguments as literal values: {app_name!r}." + ) from None + else: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException( + f"Failed to find attribute {name!r} in {module.__name__!r}." + ) from e + + # If the attribute is a function, call it with any args and kwargs + # to get the real application. + if inspect.isfunction(attr): + try: + app = attr(*args, **kwargs) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + f"The factory {app_name!r} in module" + f" {module.__name__!r} could not be called with the" + " specified arguments." + ) from e + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from" + f" '{module.__name__}:{app_name}'." + ) + + +def prepare_import(path: str) -> str: + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + if os.path.basename(path) == "__init__": + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, "__init__.py")): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return ".".join(module_name[::-1]) + + +@t.overload +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: t.Literal[True] = True +) -> Flask: ... + + +@t.overload +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: t.Literal[False] = ... +) -> Flask | None: ... + + +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: bool = True +) -> Flask | None: + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[2].tb_next: # type: ignore[union-attr] + raise NoAppException( + f"While importing {module_name!r}, an ImportError was" + f" raised:\n\n{traceback.format_exc()}" + ) from None + elif raise_if_not_found: + raise NoAppException(f"Could not import {module_name!r}.") from None + else: + return None + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(module) + else: + return find_app_by_string(module, app_name) + + +def get_version(ctx: click.Context, param: click.Parameter, value: t.Any) -> None: + if not value or ctx.resilient_parsing: + return + + flask_version = importlib.metadata.version("flask") + werkzeug_version = importlib.metadata.version("werkzeug") + + click.echo( + f"Python {platform.python_version()}\n" + f"Flask {flask_version}\n" + f"Werkzeug {werkzeug_version}", + color=ctx.color, + ) + ctx.exit() + + +version_option = click.Option( + ["--version"], + help="Show the Flask version.", + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True, +) + + +class ScriptInfo: + """Helper object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + + .. versionchanged:: 3.1 + Added the ``load_dotenv_defaults`` parameter and attribute. + """ + + def __init__( + self, + app_import_path: str | None = None, + create_app: t.Callable[..., Flask] | None = None, + set_debug_flag: bool = True, + load_dotenv_defaults: bool = True, + ) -> None: + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data: dict[t.Any, t.Any] = {} + self.set_debug_flag = set_debug_flag + + self.load_dotenv_defaults = get_load_dotenv(load_dotenv_defaults) + """Whether default ``.flaskenv`` and ``.env`` files should be loaded. + + ``ScriptInfo`` doesn't load anything, this is for reference when doing + the load elsewhere during processing. + + .. versionadded:: 3.1 + """ + + self._loaded_app: Flask | None = None + + def load_app(self) -> Flask: + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + if self._loaded_app is not None: + return self._loaded_app + app: Flask | None = None + if self.create_app is not None: + app = self.create_app() + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(import_name, None, raise_if_not_found=False) + + if app is not None: + break + + if app is None: + raise NoAppException( + "Could not locate a Flask application. Use the" + " 'flask --app' option, 'FLASK_APP' environment" + " variable, or a 'wsgi.py' or 'app.py' file in the" + " current directory." + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def with_appcontext(f: F) -> F: + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. + + Custom commands (and their options) registered under ``app.cli`` or + ``blueprint.cli`` will always have an app context available, this + decorator is not required in that case. + + .. versionchanged:: 2.2 + The app context is active for subcommands as well as the + decorated callback. The app context is always available to + ``app.cli`` command and parameter callbacks. + """ + + @click.pass_context + def decorator(ctx: click.Context, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + if not current_app: + app = ctx.ensure_object(ScriptInfo).load_app() + ctx.with_resource(app.app_context()) + + return ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) # type: ignore[return-value] + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command( # type: ignore[override] + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], click.Command]: + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop("with_appcontext", True) + + def decorator(f: t.Callable[..., t.Any]) -> click.Command: + if wrap_for_ctx: + f = with_appcontext(f) + return super(AppGroup, self).command(*args, **kwargs)(f) # type: ignore[no-any-return] + + return decorator + + def group( # type: ignore[override] + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], click.Group]: + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault("cls", AppGroup) + return super().group(*args, **kwargs) # type: ignore[no-any-return] + + +def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: + if value is None: + return None + + info = ctx.ensure_object(ScriptInfo) + info.app_import_path = value + return value + + +# This option is eager so the app will be available if --help is given. +# --help is also eager, so --app must be before it in the param list. +# no_args_is_help bypasses eager processing, so this option must be +# processed manually in that case to ensure FLASK_APP gets picked up. +_app_option = click.Option( + ["-A", "--app"], + metavar="IMPORT", + help=( + "The Flask application or factory function to load, in the form 'module:name'." + " Module can be a dotted import or file path. Name is not required if it is" + " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" + " pass arguments." + ), + is_eager=True, + expose_value=False, + callback=_set_app, +) + + +def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: + # If the flag isn't provided, it will default to False. Don't use + # that, let debug be set by env in that case. + source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] + + if source is not None and source in ( + ParameterSource.DEFAULT, + ParameterSource.DEFAULT_MAP, + ): + return None + + # Set with env var instead of ScriptInfo.load so that it can be + # accessed early during a factory function. + os.environ["FLASK_DEBUG"] = "1" if value else "0" + return value + + +_debug_option = click.Option( + ["--debug/--no-debug"], + help="Set debug mode.", + expose_value=False, + callback=_set_debug, +) + + +def _env_file_callback( + ctx: click.Context, param: click.Option, value: str | None +) -> str | None: + try: + import dotenv # noqa: F401 + except ImportError: + # Only show an error if a value was passed, otherwise we still want to + # call load_dotenv and show a message without exiting. + if value is not None: + raise click.BadParameter( + "python-dotenv must be installed to load an env file.", + ctx=ctx, + param=param, + ) from None + + # Load if a value was passed, or we want to load default files, or both. + if value is not None or ctx.obj.load_dotenv_defaults: + load_dotenv(value, load_defaults=ctx.obj.load_dotenv_defaults) + + return value + + +# This option is eager so env vars are loaded as early as possible to be +# used by other options. +_env_file_option = click.Option( + ["-e", "--env-file"], + type=click.Path(exists=True, dir_okay=False), + help=( + "Load environment variables from this file, taking precedence over" + " those set by '.env' and '.flaskenv'. Variables set directly in the" + " environment take highest precedence. python-dotenv must be installed." + ), + is_eager=True, + expose_value=False, + callback=_env_file_callback, +) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param set_debug_flag: Set the app's debug flag. + + .. versionchanged:: 3.1 + ``-e path`` takes precedence over default ``.env`` and ``.flaskenv`` files. + + .. versionchanged:: 2.2 + Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. + + .. versionchanged:: 2.2 + An app context is pushed when running ``app.cli`` commands, so + ``@with_appcontext`` is no longer required for those commands. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__( + self, + add_default_commands: bool = True, + create_app: t.Callable[..., Flask] | None = None, + add_version_option: bool = True, + load_dotenv: bool = True, + set_debug_flag: bool = True, + **extra: t.Any, + ) -> None: + params: list[click.Parameter] = list(extra.pop("params", None) or ()) + # Processing is done with option callbacks instead of a group + # callback. This allows users to make a custom group callback + # without losing the behavior. --env-file must come first so + # that it is eagerly evaluated before --app. + params.extend((_env_file_option, _app_option, _debug_option)) + + if add_version_option: + params.append(version_option) + + if "context_settings" not in extra: + extra["context_settings"] = {} + + extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") + + super().__init__(params=params, **extra) + + self.create_app = create_app + self.load_dotenv = load_dotenv + self.set_debug_flag = set_debug_flag + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self) -> None: + if self._loaded_plugin_commands: + return + + if sys.version_info >= (3, 10): + from importlib import metadata + else: + # Use a backport on Python < 3.10. We technically have + # importlib.metadata on 3.8+, but the API changed in 3.10, + # so use the backport for consistency. + import importlib_metadata as metadata # pyright: ignore + + for ep in metadata.entry_points(group="flask.commands"): + self.add_command(ep.load(), ep.name) + + self._loaded_plugin_commands = True + + def get_command(self, ctx: click.Context, name: str) -> click.Command | None: + self._load_plugin_commands() + # Look up built-in and plugin commands, which should be + # available even if the app fails to load. + rv = super().get_command(ctx, name) + + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + + # Look up commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + app = info.load_app() + except NoAppException as e: + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + return None + + # Push an app context for the loaded app unless it is already + # active somehow. This makes the context available to parameter + # and command callbacks without needing @with_appcontext. + if not current_app or current_app._get_current_object() is not app: # type: ignore[attr-defined] + ctx.with_resource(app.app_context()) + + return app.cli.get_command(ctx, name) + + def list_commands(self, ctx: click.Context) -> list[str]: + self._load_plugin_commands() + # Start with the built-in and plugin commands. + rv = set(super().list_commands(ctx)) + info = ctx.ensure_object(ScriptInfo) + + # Add commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except NoAppException as e: + # When an app couldn't be loaded, show the error message + # without the traceback. + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + except Exception: + # When any other errors occurred during loading, show the + # full traceback. + click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") + + return sorted(rv) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: click.Context | None = None, + **extra: t.Any, + ) -> click.Context: + # Set a flag to tell app.run to become a no-op. If app.run was + # not in a __name__ == __main__ guard, it would start the server + # when importing, blocking whatever command is being called. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + if "obj" not in extra and "obj" not in self.context_settings: + extra["obj"] = ScriptInfo( + create_app=self.create_app, + set_debug_flag=self.set_debug_flag, + load_dotenv_defaults=self.load_dotenv, + ) + + return super().make_context(info_name, args, parent=parent, **extra) + + def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help: + # Attempt to load --env-file and --app early in case they + # were given as env vars. Otherwise no_args_is_help will not + # see commands from app.cli. + _env_file_option.handle_parse_result(ctx, {}, []) + _app_option.handle_parse_result(ctx, {}, []) + + return super().parse_args(ctx, args) + + +def _path_is_ancestor(path: str, other: str) -> bool: + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other + + +def load_dotenv( + path: str | os.PathLike[str] | None = None, load_defaults: bool = True +) -> bool: + """Load "dotenv" files to set environment variables. A given path takes + precedence over ``.env``, which takes precedence over ``.flaskenv``. After + loading and combining these files, values are only set if the key is not + already set in ``os.environ``. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location. + :param load_defaults: Search for and load the default ``.flaskenv`` and + ``.env`` files. + :return: ``True`` if at least one env var was loaded. + + .. versionchanged:: 3.1 + Added the ``load_defaults`` parameter. A given path takes precedence + over default files. + + .. versionchanged:: 2.0 + The current directory is not changed to the location of the + loaded file. + + .. versionchanged:: 2.0 + When loading the env files, set the default encoding to UTF-8. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionadded:: 1.0 + """ + try: + import dotenv + except ImportError: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env files present. Install python-dotenv" + " to use them.", + fg="yellow", + err=True, + ) + + return False + + data: dict[str, str | None] = {} + + if load_defaults: + for default_name in (".flaskenv", ".env"): + if not (default_path := dotenv.find_dotenv(default_name, usecwd=True)): + continue + + data |= dotenv.dotenv_values(default_path, encoding="utf-8") + + if path is not None and os.path.isfile(path): + data |= dotenv.dotenv_values(path, encoding="utf-8") + + for key, value in data.items(): + if key in os.environ or value is None: + continue + + os.environ[key] = value + + return bool(data) # True if at least one env var was loaded. + + +def show_server_banner(debug: bool, app_import_path: str | None) -> None: + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if is_running_from_reloader(): + return + + if app_import_path is not None: + click.echo(f" * Serving Flask app '{app_import_path}'") + + if debug is not None: + click.echo(f" * Debug mode: {'on' if debug else 'off'}") + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = "path" + + def __init__(self) -> None: + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert( + self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None + ) -> t.Any: + try: + import ssl + except ImportError: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) from None + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import cryptography # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires the cryptography library.", + ctx, + param, + ) from None + + return value + + obj = import_string(value, silent=True) + + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx: click.Context, param: click.Parameter, value: t.Any) -> t.Any: + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get("cert") + is_adhoc = cert == "adhoc" + + try: + import ssl + except ImportError: + is_context = False + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', ctx, param + ) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key" is not used.', + ctx, + param, + ) + + if not cert: + raise click.BadParameter('"--cert" must also be specified.', ctx, param) + + ctx.params["cert"] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter('Required when using "--cert".', ctx, param) + + return value + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert( + self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None + ) -> t.Any: + items = self.split_envvar_value(value) + # can't call no-arg super() inside list comprehension until Python 3.12 + super_convert = super().convert + return [super_convert(item, param, ctx) for item in items] + + +@click.command("run", short_help="Run a development server.") +@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") +@click.option("--port", "-p", default=5000, help="The port to bind to.") +@click.option( + "--cert", + type=CertParamType(), + help="Specify a certificate file to use HTTPS.", + is_eager=True, +) +@click.option( + "--key", + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, + expose_value=False, + help="The key file to use when specifying a certificate.", +) +@click.option( + "--reload/--no-reload", + default=None, + help="Enable or disable the reloader. By default the reloader " + "is active if debug is enabled.", +) +@click.option( + "--debugger/--no-debugger", + default=None, + help="Enable or disable the debugger. By default the debugger " + "is active if debug is enabled.", +) +@click.option( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + f" are separated by {os.path.pathsep!r}." + ), +) +@click.option( + "--exclude-patterns", + default=None, + type=SeparatedPathType(), + help=( + "Files matching these fnmatch patterns will not trigger a reload" + " on change. Multiple patterns are separated by" + f" {os.path.pathsep!r}." + ), +) +@pass_script_info +def run_command( + info: ScriptInfo, + host: str, + port: int, + reload: bool, + debugger: bool, + with_threads: bool, + cert: ssl.SSLContext | tuple[str, str | None] | t.Literal["adhoc"] | None, + extra_files: list[str] | None, + exclude_patterns: list[str] | None, +) -> None: + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default with the '--debug' + option. + """ + try: + app: WSGIApplication = info.load_app() # pyright: ignore + except Exception as e: + if is_running_from_reloader(): + # When reloading, print out the error immediately, but raise + # it later so the debugger or server can handle it. + traceback.print_exc() + err = e + + def app( + environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + raise err from None + + else: + # When not reloading, raise the error immediately so the + # command fails. + raise e from None + + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + show_server_banner(debug, info.app_import_path) + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + exclude_patterns=exclude_patterns, + ) + + +run_command.params.insert(0, _debug_option) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command() -> None: + """Run an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to its configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + + banner = ( + f"Python {sys.version} on {sys.platform}\n" + f"App: {current_app.import_name}\n" + f"Instance: {current_app.instance_path}" + ) + ctx: dict[str, t.Any] = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup) as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(current_app.make_shell_context()) + + # Site, customize, or startup script can set a hook to call when + # entering interactive mode. The default one sets up readline with + # tab and history completion. + interactive_hook = getattr(sys, "__interactivehook__", None) + + if interactive_hook is not None: + try: + import readline + from rlcompleter import Completer + except ImportError: + pass + else: + # rlcompleter uses __main__.__dict__ by default, which is + # flask.__main__. Use the shell context instead. + readline.set_completer(Completer(ctx).complete) + + interactive_hook() + + code.interact(banner=banner, local=ctx) + + +@click.command("routes", short_help="Show the routes for the app.") +@click.option( + "--sort", + "-s", + type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), + default="endpoint", + help=( + "Method to sort routes by. 'match' is the order that Flask will match routes" + " when dispatching a request." + ), +) +@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") +@with_appcontext +def routes_command(sort: str, all_methods: bool) -> None: + """Show all registered routes with endpoints and methods.""" + rules = list(current_app.url_map.iter_rules()) + + if not rules: + click.echo("No routes were registered.") + return + + ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} + host_matching = current_app.url_map.host_matching + has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) + rows = [] + + for rule in rules: + row = [ + rule.endpoint, + ", ".join(sorted((rule.methods or set()) - ignored_methods)), + ] + + if has_domain: + row.append((rule.host if host_matching else rule.subdomain) or "") + + row.append(rule.rule) + rows.append(row) + + headers = ["Endpoint", "Methods"] + sorts = ["endpoint", "methods"] + + if has_domain: + headers.append("Host" if host_matching else "Subdomain") + sorts.append("domain") + + headers.append("Rule") + sorts.append("rule") + + try: + rows.sort(key=itemgetter(sorts.index(sort))) + except ValueError: + pass + + rows.insert(0, headers) + widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] + rows.insert(1, ["-" * w for w in widths]) + template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) + + for row in rows: + click.echo(template.format(*row)) + + +cli = FlaskGroup( + name="flask", + help="""\ +A general utility script for Flask applications. + +An application to load must be given with the '--app' option, +'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file +in the current directory. +""", +) + + +def main() -> None: + cli.main() + + +if __name__ == "__main__": + main() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/config.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/config.py new file mode 100644 index 00000000..34ef1a57 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/config.py @@ -0,0 +1,367 @@ +from __future__ import annotations + +import errno +import json +import os +import types +import typing as t + +from werkzeug.utils import import_string + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .sansio.app import App + + +T = t.TypeVar("T") + + +class ConfigAttribute(t.Generic[T]): + """Makes an attribute forward to the config""" + + def __init__( + self, name: str, get_converter: t.Callable[[t.Any], T] | None = None + ) -> None: + self.__name__ = name + self.get_converter = get_converter + + @t.overload + def __get__(self, obj: None, owner: None) -> te.Self: ... + + @t.overload + def __get__(self, obj: App, owner: type[App]) -> T: ... + + def __get__(self, obj: App | None, owner: type[App] | None = None) -> T | te.Self: + if obj is None: + return self + + rv = obj.config[self.__name__] + + if self.get_converter is not None: + rv = self.get_converter(rv) + + return rv # type: ignore[no-any-return] + + def __set__(self, obj: App, value: t.Any) -> None: + obj.config[self.__name__] = value + + +class Config(dict): # type: ignore[type-arg] + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__( + self, + root_path: str | os.PathLike[str], + defaults: dict[str, t.Any] | None = None, + ) -> None: + super().__init__(defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name: str, silent: bool = False) -> bool: + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + f"The environment variable {variable_name!r} is not set" + " and as such configuration could not be loaded. Set" + " this variable and make it point to a configuration" + " file" + ) + return self.from_pyfile(rv, silent=silent) + + def from_prefixed_env( + self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads + ) -> bool: + """Load any environment variables that start with ``FLASK_``, + dropping the prefix from the env key for the config key. Values + are passed through a loading function to attempt to convert them + to more specific types than strings. + + Keys are loaded in :func:`sorted` order. + + The default loading function attempts to parse values as any + valid JSON type, including dicts and lists. + + Specific items in nested dicts can be set by separating the + keys with double underscores (``__``). If an intermediate key + doesn't exist, it will be initialized to an empty dict. + + :param prefix: Load env vars that start with this prefix, + separated with an underscore (``_``). + :param loads: Pass each string value to this function and use + the returned value as the config value. If any error is + raised it is ignored and the value remains a string. The + default is :func:`json.loads`. + + .. versionadded:: 2.1 + """ + prefix = f"{prefix}_" + + for key in sorted(os.environ): + if not key.startswith(prefix): + continue + + value = os.environ[key] + key = key.removeprefix(prefix) + + try: + value = loads(value) + except Exception: + # Keep the value as a string if loading failed. + pass + + if "__" not in key: + # A non-nested key, set directly. + self[key] = value + continue + + # Traverse nested dictionaries with keys separated by "__". + current = self + *parts, tail = key.split("__") + + for part in parts: + # If an intermediate dict does not exist, create it. + if part not in current: + current[part] = {} + + current = current[part] + + current[tail] = value + + return True + + def from_pyfile( + self, filename: str | os.PathLike[str], silent: bool = False + ) -> bool: + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType("config") + d.__file__ = filename + try: + with open(filename, mode="rb") as config_file: + exec(compile(config_file.read(), filename, "exec"), d.__dict__) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + self.from_object(d) + return True + + def from_object(self, obj: object | str) -> None: + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, str): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_file( + self, + filename: str | os.PathLike[str], + load: t.Callable[[t.IO[t.Any]], t.Mapping[str, t.Any]], + silent: bool = False, + text: bool = True, + ) -> bool: + """Update the values in the config from a file that is loaded + using the ``load`` parameter. The loaded data is passed to the + :meth:`from_mapping` method. + + .. code-block:: python + + import json + app.config.from_file("config.json", load=json.load) + + import tomllib + app.config.from_file("config.toml", load=tomllib.load, text=False) + + :param filename: The path to the data file. This can be an + absolute path or relative to the config root path. + :param load: A callable that takes a file handle and returns a + mapping of loaded data from the file. + :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` + implements a ``read`` method. + :param silent: Ignore the file if it doesn't exist. + :param text: Open the file in text or binary mode. + :return: ``True`` if the file was loaded successfully. + + .. versionchanged:: 2.3 + The ``text`` parameter was added. + + .. versionadded:: 2.0 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename, "r" if text else "rb") as f: + obj = load(f) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + + return self.from_mapping(obj) + + def from_mapping( + self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any + ) -> bool: + """Updates the config like :meth:`update` ignoring items with + non-upper keys. + + :return: Always returns ``True``. + + .. versionadded:: 0.11 + """ + mappings: dict[str, t.Any] = {} + if mapping is not None: + mappings.update(mapping) + mappings.update(kwargs) + for key, value in mappings.items(): + if key.isupper(): + self[key] = value + return True + + def get_namespace( + self, namespace: str, lowercase: bool = True, trim_namespace: bool = True + ) -> dict[str, t.Any]: + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in self.items(): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace) :] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self) -> str: + return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/ctx.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/ctx.py new file mode 100644 index 00000000..9b164d39 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/ctx.py @@ -0,0 +1,449 @@ +from __future__ import annotations + +import contextvars +import sys +import typing as t +from functools import update_wrapper +from types import TracebackType + +from werkzeug.exceptions import HTTPException + +from . import typing as ft +from .globals import _cv_app +from .globals import _cv_request +from .signals import appcontext_popped +from .signals import appcontext_pushed + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIEnvironment + + from .app import Flask + from .sessions import SessionMixin + from .wrappers import Request + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals: + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + # Define attr methods to let mypy know this is a namespace object + # that has arbitrary attributes. + + def __getattr__(self, name: str) -> t.Any: + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def __setattr__(self, name: str, value: t.Any) -> None: + self.__dict__[name] = value + + def __delattr__(self, name: str) -> None: + try: + del self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def get(self, name: str, default: t.Any | None = None) -> t.Any: + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raising a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name: str, default: t.Any = None) -> t.Any: + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item: str) -> bool: + return item in self.__dict__ + + def __iter__(self) -> t.Iterator[str]: + return iter(self.__dict__) + + def __repr__(self) -> str: + ctx = _cv_app.get(None) + if ctx is not None: + return f"" + return object.__repr__(self) + + +def after_this_request( + f: ft.AfterRequestCallable[t.Any], +) -> ft.AfterRequestCallable[t.Any]: + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'after_this_request' can only be used when a request" + " context is active, such as in a view function." + ) + + ctx._after_request_functions.append(f) + return f + + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def copy_current_request_context(f: F) -> F: + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. The current session is also + included in the copied request context. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'copy_current_request_context' can only be used when a" + " request context is active, such as in a view function." + ) + + ctx = ctx.copy() + + def wrapper(*args: t.Any, **kwargs: t.Any) -> t.Any: + with ctx: # type: ignore[union-attr] + return ctx.app.ensure_sync(f)(*args, **kwargs) # type: ignore[union-attr] + + return update_wrapper(wrapper, f) # type: ignore[return-value] + + +def has_request_context() -> bool: + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g`) for truthness:: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _cv_request.get(None) is not None + + +def has_app_context() -> bool: + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _cv_app.get(None) is not None + + +class AppContext: + """The app context contains application-specific information. An app + context is created and pushed at the beginning of each request if + one is not already active. An app context is also pushed when + running CLI commands. + """ + + def __init__(self, app: Flask) -> None: + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g: _AppCtxGlobals = app.app_ctx_globals_class() + self._cv_tokens: list[contextvars.Token[AppContext]] = [] + + def push(self) -> None: + """Binds the app context to the current context.""" + self._cv_tokens.append(_cv_app.set(self)) + appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the app context.""" + try: + if len(self._cv_tokens) == 1: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + ctx = _cv_app.get() + _cv_app.reset(self._cv_tokens.pop()) + + if ctx is not self: + raise AssertionError( + f"Popped wrong app context. ({ctx!r} instead of {self!r})" + ) + + appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) + + def __enter__(self) -> AppContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + +class RequestContext: + """The request context contains per-request information. The Flask + app creates and pushes it at the beginning of the request, then pops + it at the end of the request. It will create the URL adapter and + request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the + request. When using the interactive debugger, the context will be + restored so ``request`` is still accessible. Similarly, the test + client can preserve the context after the request ends. However, + teardown functions may already have closed some resources such as + database connections. + """ + + def __init__( + self, + app: Flask, + environ: WSGIEnvironment, + request: Request | None = None, + session: SessionMixin | None = None, + ) -> None: + self.app = app + if request is None: + request = app.request_class(environ) + request.json_module = app.json + self.request: Request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes: list[tuple[str, str]] | None = None + self.session: SessionMixin | None = session + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions: list[ft.AfterRequestCallable[t.Any]] = [] + + self._cv_tokens: list[ + tuple[contextvars.Token[RequestContext], AppContext | None] + ] = [] + + def copy(self) -> RequestContext: + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self) -> None: + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) # type: ignore + self.request.url_rule, self.request.view_args = result # type: ignore + except HTTPException as e: + self.request.routing_exception = e + + def push(self) -> None: + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _cv_app.get(None) + + if app_ctx is None or app_ctx.app is not self.app: + app_ctx = self.app.app_context() + app_ctx.push() + else: + app_ctx = None + + self._cv_tokens.append((_cv_request.set(self), app_ctx)) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session(self.app, self.request) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + # Match the request URL after loading the session, so that the + # session is available in custom URL converters. + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + clear_request = len(self._cv_tokens) == 1 + + try: + if clear_request: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + finally: + ctx = _cv_request.get() + token, app_ctx = self._cv_tokens.pop() + _cv_request.reset(token) + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + ctx.request.environ["werkzeug.request"] = None + + if app_ctx is not None: + app_ctx.pop(exc) + + if ctx is not self: + raise AssertionError( + f"Popped wrong request context. ({ctx!r} instead of {self!r})" + ) + + def __enter__(self) -> RequestContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} {self.request.url!r}" + f" [{self.request.method}] of {self.app.name}>" + ) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/debughelpers.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/debughelpers.py new file mode 100644 index 00000000..2c8c4c48 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/debughelpers.py @@ -0,0 +1,178 @@ +from __future__ import annotations + +import typing as t + +from jinja2.loaders import BaseLoader +from werkzeug.routing import RequestRedirect + +from .blueprints import Blueprint +from .globals import request_ctx +from .sansio.app import App + +if t.TYPE_CHECKING: + from .sansio.scaffold import Scaffold + from .wrappers import Request + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request: Request, key: str) -> None: + form_matches = request.form.getlist(key) + buf = [ + f"You tried to access the file {key!r} in the request.files" + " dictionary but it does not exist. The mimetype for the" + f" request is {request.mimetype!r} instead of" + " 'multipart/form-data' which means that no file contents" + " were transmitted. To fix this error you should provide" + ' enctype="multipart/form-data" in your form.' + ] + if form_matches: + names = ", ".join(repr(x) for x in form_matches) + buf.append( + "\n\nThe browser instead transmitted some file names. " + f"This was submitted: {names}" + ) + self.msg = "".join(buf) + + def __str__(self) -> str: + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised in debug mode if a routing redirect + would cause the browser to drop the method or body. This happens + when method is not GET, HEAD or OPTIONS and the status code is not + 307 or 308. + """ + + def __init__(self, request: Request) -> None: + exc = request.routing_exception + assert isinstance(exc, RequestRedirect) + buf = [ + f"A request was sent to '{request.url}', but routing issued" + f" a redirect to the canonical URL '{exc.new_url}'." + ] + + if f"{request.base_url}/" == exc.new_url.partition("?")[0]: + buf.append( + " The URL was defined with a trailing slash. Flask" + " will redirect to the URL with a trailing slash if it" + " was accessed without one." + ) + + buf.append( + " Send requests to the canonical URL, or use 307 or 308 for" + " routing redirects. Otherwise, browsers will drop form" + " data.\n\n" + "This exception is only raised in debug mode." + ) + super().__init__("".join(buf)) + + +def attach_enctype_error_multidict(request: Request) -> None: + """Patch ``request.files.__getitem__`` to raise a descriptive error + about ``enctype=multipart/form-data``. + + :param request: The request to patch. + :meta private: + """ + oldcls = request.files.__class__ + + class newcls(oldcls): # type: ignore[valid-type, misc] + def __getitem__(self, key: str) -> t.Any: + try: + return super().__getitem__(key) + except KeyError as e: + if key not in request.form: + raise + + raise DebugFilesKeyError(request, key).with_traceback( + e.__traceback__ + ) from None + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader: BaseLoader) -> t.Iterator[str]: + yield f"class: {type(loader).__module__}.{type(loader).__name__}" + for key, value in sorted(loader.__dict__.items()): + if key.startswith("_"): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, str) for x in value): + continue + yield f"{key}:" + for item in value: + yield f" - {item}" + continue + elif not isinstance(value, (str, int, float, bool)): + continue + yield f"{key}: {value!r}" + + +def explain_template_loading_attempts( + app: App, + template: str, + attempts: list[ + tuple[ + BaseLoader, + Scaffold, + tuple[str, str | None, t.Callable[[], bool] | None] | None, + ] + ], +) -> None: + """This should help developers understand what failed""" + info = [f"Locating template {template!r}:"] + total_found = 0 + blueprint = None + if request_ctx and request_ctx.request.blueprint is not None: + blueprint = request_ctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, App): + src_info = f"application {srcobj.import_name!r}" + elif isinstance(srcobj, Blueprint): + src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" + else: + src_info = repr(srcobj) + + info.append(f"{idx + 1:5}: trying loader of {src_info}") + + for line in _dump_loader_info(loader): + info.append(f" {line}") + + if triple is None: + detail = "no match" + else: + detail = f"found ({triple[1] or ''!r})" + total_found += 1 + info.append(f" -> {detail}") + + seems_fishy = False + if total_found == 0: + info.append("Error: the template could not be found.") + seems_fishy = True + elif total_found > 1: + info.append("Warning: multiple loaders returned a match for the template.") + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append( + " The template was looked up from an endpoint that belongs" + f" to the blueprint {blueprint!r}." + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See https://flask.palletsprojects.com/blueprints/#templates") + + app.logger.info("\n".join(info)) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/globals.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/globals.py new file mode 100644 index 00000000..e2c410cc --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/globals.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import typing as t +from contextvars import ContextVar + +from werkzeug.local import LocalProxy + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .ctx import _AppCtxGlobals + from .ctx import AppContext + from .ctx import RequestContext + from .sessions import SessionMixin + from .wrappers import Request + + +_no_app_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +the current application. To solve this, set up an application context +with app.app_context(). See the documentation for more information.\ +""" +_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") +app_ctx: AppContext = LocalProxy( # type: ignore[assignment] + _cv_app, unbound_message=_no_app_msg +) +current_app: Flask = LocalProxy( # type: ignore[assignment] + _cv_app, "app", unbound_message=_no_app_msg +) +g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] + _cv_app, "g", unbound_message=_no_app_msg +) + +_no_req_msg = """\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +""" +_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") +request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] + _cv_request, unbound_message=_no_req_msg +) +request: Request = LocalProxy( # type: ignore[assignment] + _cv_request, "request", unbound_message=_no_req_msg +) +session: SessionMixin = LocalProxy( # type: ignore[assignment] + _cv_request, "session", unbound_message=_no_req_msg +) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/helpers.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/helpers.py new file mode 100644 index 00000000..a6b7e150 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/helpers.py @@ -0,0 +1,634 @@ +from __future__ import annotations + +import importlib.util +import os +import sys +import typing as t +from datetime import datetime +from functools import cache +from functools import update_wrapper + +import werkzeug.utils +from werkzeug.exceptions import abort as _wz_abort +from werkzeug.utils import redirect as _wz_redirect +from werkzeug.wrappers import Response as BaseResponse + +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .globals import request_ctx +from .globals import session +from .signals import message_flashed + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +def get_debug_flag() -> bool: + """Get whether debug mode should be enabled for the app, indicated by the + :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. + """ + val = os.environ.get("FLASK_DEBUG") + return bool(val and val.lower() not in {"0", "false", "no"}) + + +def get_load_dotenv(default: bool = True) -> bool: + """Get whether the user has disabled loading default dotenv files by + setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load + the files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get("FLASK_SKIP_DOTENV") + + if not val: + return default + + return val.lower() in ("0", "false", "no") + + +@t.overload +def stream_with_context( + generator_or_function: t.Iterator[t.AnyStr], +) -> t.Iterator[t.AnyStr]: ... + + +@t.overload +def stream_with_context( + generator_or_function: t.Callable[..., t.Iterator[t.AnyStr]], +) -> t.Callable[[t.Iterator[t.AnyStr]], t.Iterator[t.AnyStr]]: ... + + +def stream_with_context( + generator_or_function: t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]], +) -> t.Iterator[t.AnyStr] | t.Callable[[t.Iterator[t.AnyStr]], t.Iterator[t.AnyStr]]: + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) # type: ignore[arg-type] + except TypeError: + + def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: + gen = generator_or_function(*args, **kwargs) # type: ignore[operator] + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) # type: ignore[arg-type] + + def generator() -> t.Iterator[t.AnyStr | None]: + ctx = _cv_request.get(None) + if ctx is None: + raise RuntimeError( + "'stream_with_context' can only be used when a request" + " context is active, such as in a view function." + ) + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + yield from gen + finally: + if hasattr(gen, "close"): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g # type: ignore[return-value] + + +def make_response(*args: t.Any) -> Response: + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) + + +def url_for( + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, +) -> str: + """Generate a URL to the given endpoint with the given values. + + This requires an active request or application context, and calls + :meth:`current_app.url_for() `. See that method + for full documentation. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it is + external. + :param _external: If given, prefer the URL to be internal (False) or + require it to be external (True). External URLs include the + scheme and domain. When not in an active request, URLs are + external by default. + :param values: Values to use for the variable parts of the URL rule. + Unknown keys are appended as query string arguments, like + ``?a=b&c=d``. + + .. versionchanged:: 2.2 + Calls ``current_app.url_for``, allowing an app to override the + behavior. + + .. versionchanged:: 0.10 + The ``_scheme`` parameter was added. + + .. versionchanged:: 0.9 + The ``_anchor`` and ``_method`` parameters were added. + + .. versionchanged:: 0.9 + Calls ``app.handle_url_build_error`` on build errors. + """ + return current_app.url_for( + endpoint, + _anchor=_anchor, + _method=_method, + _scheme=_scheme, + _external=_external, + **values, + ) + + +def redirect( + location: str, code: int = 302, Response: type[BaseResponse] | None = None +) -> BaseResponse: + """Create a redirect response object. + + If :data:`~flask.current_app` is available, it will use its + :meth:`~flask.Flask.redirect` method, otherwise it will use + :func:`werkzeug.utils.redirect`. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + :param Response: The response class to use. Not used when + ``current_app`` is active, which uses ``app.response_class``. + + .. versionadded:: 2.2 + Calls ``current_app.redirect`` if available instead of always + using Werkzeug's default ``redirect``. + """ + if current_app: + return current_app.redirect(location, code=code) + + return _wz_redirect(location, code=code, Response=Response) + + +def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given + status code. + + If :data:`~flask.current_app` is available, it will call its + :attr:`~flask.Flask.aborter` object, otherwise it will use + :func:`werkzeug.exceptions.abort`. + + :param code: The status code for the exception, which must be + registered in ``app.aborter``. + :param args: Passed to the exception. + :param kwargs: Passed to the exception. + + .. versionadded:: 2.2 + Calls ``current_app.aborter`` if available instead of always + using Werkzeug's default ``abort``. + """ + if current_app: + current_app.aborter(code, *args, **kwargs) + + _wz_abort(code, *args, **kwargs) + + +def get_template_attribute(template_name: str, attribute: str) -> t.Any: + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, attribute) + + +def flash(message: str, category: str = "message") -> None: + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get("_flashes", []) + flashes.append((category, message)) + session["_flashes"] = flashes + app = current_app._get_current_object() # type: ignore + message_flashed.send( + app, + _async_wrapper=app.ensure_sync, + message=message, + category=category, + ) + + +def get_flashed_messages( + with_categories: bool = False, category_filter: t.Iterable[str] = () +) -> list[str] | list[tuple[str, str]]: + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :doc:`/patterns/flashing` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: filter of categories to limit return values. Only + categories in the list will be returned. + """ + flashes = request_ctx.flashes + if flashes is None: + flashes = session.pop("_flashes") if "_flashes" in session else [] + request_ctx.flashes = flashes + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: + if kwargs.get("max_age") is None: + kwargs["max_age"] = current_app.get_send_file_max_age + + kwargs.update( + environ=request.environ, + use_x_sendfile=current_app.config["USE_X_SENDFILE"], + response_class=current_app.response_class, + _root_path=current_app.root_path, # type: ignore + ) + return kwargs + + +def send_file( + path_or_file: os.PathLike[t.AnyStr] | str | t.BinaryIO, + mimetype: str | None = None, + as_attachment: bool = False, + download_name: str | None = None, + conditional: bool = True, + etag: bool | str = True, + last_modified: datetime | int | float | None = None, + max_age: None | (int | t.Callable[[str | None], int | None]) = None, +) -> Response: + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve + user-requested paths from within a directory. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, configuring Flask with + ``USE_X_SENDFILE = True`` will tell the server to send the given + path, which is much more efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + + .. versionchanged:: 2.0 + ``download_name`` replaces the ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces the ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces the ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + Passing a file-like object that inherits from + :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather + than sending an empty file. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionchanged:: 1.1 + ``filename`` may be a :class:`~os.PathLike` object. + + .. versionchanged:: 1.1 + Passing a :class:`~io.BytesIO` object supports range requests. + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.0 + UTF-8 filenames as specified in :rfc:`2231` are supported. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file + objects. If you want to use automatic MIME and etag support, + pass a filename via ``filename_or_fp`` or + ``attachment_filename``. + + .. versionchanged:: 0.12 + ``attachment_filename`` is preferred over ``filename`` for MIME + detection. + + .. versionchanged:: 0.9 + ``cache_timeout`` defaults to + :meth:`Flask.get_send_file_max_age`. + + .. versionchanged:: 0.7 + MIME guessing and etag support for file-like objects was + removed because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. + + .. versionchanged:: 0.5 + The ``add_etags``, ``cache_timeout`` and ``conditional`` + parameters were added. The default behavior is to add etags. + + .. versionadded:: 0.2 + """ + return werkzeug.utils.send_file( # type: ignore[return-value] + **_prepare_send_file_kwargs( + path_or_file=path_or_file, + environ=request.environ, + mimetype=mimetype, + as_attachment=as_attachment, + download_name=download_name, + conditional=conditional, + etag=etag, + last_modified=last_modified, + max_age=max_age, + ) + ) + + +def send_from_directory( + directory: os.PathLike[str] | str, + path: os.PathLike[str] | str, + **kwargs: t.Any, +) -> Response: + """Send a file from within a directory using :func:`send_file`. + + .. code-block:: python + + @app.route("/uploads/") + def download_file(name): + return send_from_directory( + app.config['UPLOAD_FOLDER'], name, as_attachment=True + ) + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under, + relative to the current application's root path. This *must not* + be a value provided by the client, otherwise it becomes insecure. + :param path: The path to the file to send, relative to + ``directory``. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionchanged:: 2.0 + ``path`` replaces the ``filename`` parameter. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionadded:: 0.5 + """ + return werkzeug.utils.send_from_directory( # type: ignore[return-value] + directory, path, **_prepare_send_file_kwargs(**kwargs) + ) + + +def get_root_path(import_name: str) -> str: + """Find the root path of a package, or the path that contains a + module. If it cannot be found, returns the current working + directory. + + Not to be confused with the value returned by :func:`find_package`. + + :meta private: + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + + if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + try: + spec = importlib.util.find_spec(import_name) + + if spec is None: + raise ValueError + except (ImportError, ValueError): + loader = None + else: + loader = spec.loader + + # Loader does not exist or we're referring to an unloaded main + # module or a main module without path (interactive sessions), go + # with the current working directory. + if loader is None: + return os.getcwd() + + if hasattr(loader, "get_filename"): + filepath = loader.get_filename(import_name) # pyright: ignore + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, "__file__", None) + + # If we don't have a file path it might be because it is a + # namespace package. In this case pick the root path from the + # first module that is contained in the package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided module" + f" {import_name!r}. This can happen because the module" + " came from an import hook that does not provide file" + " name information or because it's a namespace package." + " In this case the root path needs to be explicitly" + " provided." + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) # type: ignore[no-any-return] + + +@cache +def _split_blueprint_path(name: str) -> list[str]: + out: list[str] = [name] + + if "." in name: + out.extend(_split_blueprint_path(name.rpartition(".")[0])) + + return out diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__init__.py new file mode 100644 index 00000000..c0941d04 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__init__.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +import json as _json +import typing as t + +from ..globals import current_app +from .provider import _default + +if t.TYPE_CHECKING: # pragma: no cover + from ..wrappers import Response + + +def dumps(obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dumps() ` + method, otherwise it will use :func:`json.dumps`. + + :param obj: The data to serialize. + :param kwargs: Arguments passed to the ``dumps`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dumps``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.dumps(obj, **kwargs) + + kwargs.setdefault("default", _default) + return _json.dumps(obj, **kwargs) + + +def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dump() ` + method, otherwise it will use :func:`json.dump`. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: Arguments passed to the ``dump`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dump``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + Writing to a binary file, and the ``encoding`` argument, will be + removed in Flask 2.1. + """ + if current_app: + current_app.json.dump(obj, fp, **kwargs) + else: + kwargs.setdefault("default", _default) + _json.dump(obj, fp, **kwargs) + + +def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.loads() ` + method, otherwise it will use :func:`json.loads`. + + :param s: Text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``loads`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.loads``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The data must be a + string or UTF-8 bytes. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.loads(s, **kwargs) + + return _json.loads(s, **kwargs) + + +def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.load() ` + method, otherwise it will use :func:`json.load`. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``load`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.load``, allowing an app to override + the behavior. + + .. versionchanged:: 2.2 + The ``app`` parameter will be removed in Flask 2.3. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The file must be text + mode, or binary mode with UTF-8 bytes. + """ + if current_app: + return current_app.json.load(fp, **kwargs) + + return _json.load(fp, **kwargs) + + +def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. A dict or list returned from a view will be converted to a + JSON response automatically without needing to call this. + + This requires an active request or application context, and calls + :meth:`app.json.response() `. + + In debug mode, the output is formatted with indentation to make it + easier to read. This may also be controlled by the provider. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + + .. versionchanged:: 2.2 + Calls ``current_app.json.response``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 0.11 + Added support for serializing top-level arrays. This was a + security risk in ancient browsers. See :ref:`security-json`. + + .. versionadded:: 0.2 + """ + return current_app.json.response(*args, **kwargs) # type: ignore[return-value] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2d82e30ad5a17e5d86707c483318f8e81c2b54f GIT binary patch literal 6695 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 T{z^R~%dsmH{~^(n^X|U^KHxTB literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59e8387b892412f6a61b08a174d6ad9986234943 GIT binary patch literal 13957 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 K-j}H4vhsgSZ7(_i literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/provider.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/provider.py new file mode 100644 index 00000000..ea7e4753 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/provider.py @@ -0,0 +1,215 @@ +from __future__ import annotations + +import dataclasses +import decimal +import json +import typing as t +import uuid +import weakref +from datetime import date + +from werkzeug.http import http_date + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.sansio.response import Response + + from ..sansio.app import App + + +class JSONProvider: + """A standard set of JSON operations for an application. Subclasses + of this can be used to customize JSON behavior or use different + JSON libraries. + + To implement a provider for a specific library, subclass this base + class and implement at least :meth:`dumps` and :meth:`loads`. All + other methods have default implementations. + + To use a different provider, either subclass ``Flask`` and set + :attr:`~flask.Flask.json_provider_class` to a provider class, or set + :attr:`app.json ` to an instance of the class. + + :param app: An application instance. This will be stored as a + :class:`weakref.proxy` on the :attr:`_app` attribute. + + .. versionadded:: 2.2 + """ + + def __init__(self, app: App) -> None: + self._app: App = weakref.proxy(app) + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + :param obj: The data to serialize. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: May be passed to the underlying JSON library. + """ + fp.write(self.dumps(obj, **kwargs)) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + :param s: Text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + return self.loads(fp.read(), **kwargs) + + def _prepare_response_obj( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> t.Any: + if args and kwargs: + raise TypeError("app.json.response() takes either args or kwargs, not both") + + if not args and not kwargs: + return None + + if len(args) == 1: + return args[0] + + return args or kwargs + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. + + The :func:`~flask.json.jsonify` function calls this method for + the current application. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + return self._app.response_class(self.dumps(obj), mimetype="application/json") + + +def _default(o: t.Any) -> t.Any: + if isinstance(o, date): + return http_date(o) + + if isinstance(o, (decimal.Decimal, uuid.UUID)): + return str(o) + + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) # type: ignore[arg-type] + + if hasattr(o, "__html__"): + return str(o.__html__()) + + raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") + + +class DefaultJSONProvider(JSONProvider): + """Provide JSON operations using Python's built-in :mod:`json` + library. Serializes the following additional data types: + + - :class:`datetime.datetime` and :class:`datetime.date` are + serialized to :rfc:`822` strings. This is the same as the HTTP + date format. + - :class:`uuid.UUID` is serialized to a string. + - :class:`dataclasses.dataclass` is passed to + :func:`dataclasses.asdict`. + - :class:`~markupsafe.Markup` (or any object with a ``__html__`` + method) will call the ``__html__`` method to get a string. + """ + + default: t.Callable[[t.Any], t.Any] = staticmethod(_default) # type: ignore[assignment] + """Apply this function to any object that :meth:`json.dumps` does + not know how to serialize. It should return a valid JSON type or + raise a ``TypeError``. + """ + + ensure_ascii = True + """Replace non-ASCII characters with escape sequences. This may be + more compatible with some clients, but can be disabled for better + performance and size. + """ + + sort_keys = True + """Sort the keys in any serialized dicts. This may be useful for + some caching situations, but can be disabled for better performance. + When enabled, keys must all be strings, they are not converted + before sorting. + """ + + compact: bool | None = None + """If ``True``, or ``None`` out of debug mode, the :meth:`response` + output will not add indentation, newlines, or spaces. If ``False``, + or ``None`` in debug mode, it will use a non-compact representation. + """ + + mimetype = "application/json" + """The mimetype set in :meth:`response`.""" + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON to a string. + + Keyword arguments are passed to :func:`json.dumps`. Sets some + parameter defaults from the :attr:`default`, + :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. + + :param obj: The data to serialize. + :param kwargs: Passed to :func:`json.dumps`. + """ + kwargs.setdefault("default", self.default) + kwargs.setdefault("ensure_ascii", self.ensure_ascii) + kwargs.setdefault("sort_keys", self.sort_keys) + return json.dumps(obj, **kwargs) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON from a string or bytes. + + :param s: Text or UTF-8 bytes. + :param kwargs: Passed to :func:`json.loads`. + """ + return json.loads(s, **kwargs) + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with it. The response mimetype + will be "application/json" and can be changed with + :attr:`mimetype`. + + If :attr:`compact` is ``False`` or debug mode is enabled, the + output will be formatted to be easier to read. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + dump_args: dict[str, t.Any] = {} + + if (self.compact is None and self._app.debug) or self.compact is False: + dump_args.setdefault("indent", 2) + else: + dump_args.setdefault("separators", (",", ":")) + + return self._app.response_class( + f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype + ) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/tag.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/tag.py new file mode 100644 index 00000000..8dc3629b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/json/tag.py @@ -0,0 +1,327 @@ +""" +Tagged JSON +~~~~~~~~~~~ + +A compact representation for lossless serialization of non-standard JSON +types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this +to serialize the session data, but it may be useful in other places. It +can be extended to support other types. + +.. autoclass:: TaggedJSONSerializer + :members: + +.. autoclass:: JSONTag + :members: + +Let's see an example that adds support for +:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so +to handle this we will dump the items as a list of ``[key, value]`` +pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to +identify the type. The session serializer processes dicts first, so +insert the new tag at the front of the order since ``OrderedDict`` must +be processed before ``dict``. + +.. code-block:: python + + from flask.json.tag import JSONTag + + class TagOrderedDict(JSONTag): + __slots__ = ('serializer',) + key = ' od' + + def check(self, value): + return isinstance(value, OrderedDict) + + def to_json(self, value): + return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] + + def to_python(self, value): + return OrderedDict(value) + + app.session_interface.serializer.register(TagOrderedDict, index=0) +""" + +from __future__ import annotations + +import typing as t +from base64 import b64decode +from base64 import b64encode +from datetime import datetime +from uuid import UUID + +from markupsafe import Markup +from werkzeug.http import http_date +from werkzeug.http import parse_date + +from ..json import dumps +from ..json import loads + + +class JSONTag: + """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" + + __slots__ = ("serializer",) + + #: The tag to mark the serialized object with. If empty, this tag is + #: only used as an intermediate step during tagging. + key: str = "" + + def __init__(self, serializer: TaggedJSONSerializer) -> None: + """Create a tagger for the given serializer.""" + self.serializer = serializer + + def check(self, value: t.Any) -> bool: + """Check if the given value should be tagged by this tag.""" + raise NotImplementedError + + def to_json(self, value: t.Any) -> t.Any: + """Convert the Python object to an object that is a valid JSON type. + The tag will be added later.""" + raise NotImplementedError + + def to_python(self, value: t.Any) -> t.Any: + """Convert the JSON representation back to the correct type. The tag + will already be removed.""" + raise NotImplementedError + + def tag(self, value: t.Any) -> dict[str, t.Any]: + """Convert the value to a valid JSON type and add the tag structure + around it.""" + return {self.key: self.to_json(value)} + + +class TagDict(JSONTag): + """Tag for 1-item dicts whose only key matches a registered tag. + + Internally, the dict key is suffixed with `__`, and the suffix is removed + when deserializing. + """ + + __slots__ = () + key = " di" + + def check(self, value: t.Any) -> bool: + return ( + isinstance(value, dict) + and len(value) == 1 + and next(iter(value)) in self.serializer.tags + ) + + def to_json(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {f"{key}__": self.serializer.tag(value[key])} + + def to_python(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {key[:-2]: value[key]} + + +class PassDict(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, dict) + + def to_json(self, value: t.Any) -> t.Any: + # JSON objects may only have string keys, so don't bother tagging the + # key here. + return {k: self.serializer.tag(v) for k, v in value.items()} + + tag = to_json + + +class TagTuple(JSONTag): + __slots__ = () + key = " t" + + def check(self, value: t.Any) -> bool: + return isinstance(value, tuple) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + def to_python(self, value: t.Any) -> t.Any: + return tuple(value) + + +class PassList(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, list) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + tag = to_json + + +class TagBytes(JSONTag): + __slots__ = () + key = " b" + + def check(self, value: t.Any) -> bool: + return isinstance(value, bytes) + + def to_json(self, value: t.Any) -> t.Any: + return b64encode(value).decode("ascii") + + def to_python(self, value: t.Any) -> t.Any: + return b64decode(value) + + +class TagMarkup(JSONTag): + """Serialize anything matching the :class:`~markupsafe.Markup` API by + having a ``__html__`` method to the result of that method. Always + deserializes to an instance of :class:`~markupsafe.Markup`.""" + + __slots__ = () + key = " m" + + def check(self, value: t.Any) -> bool: + return callable(getattr(value, "__html__", None)) + + def to_json(self, value: t.Any) -> t.Any: + return str(value.__html__()) + + def to_python(self, value: t.Any) -> t.Any: + return Markup(value) + + +class TagUUID(JSONTag): + __slots__ = () + key = " u" + + def check(self, value: t.Any) -> bool: + return isinstance(value, UUID) + + def to_json(self, value: t.Any) -> t.Any: + return value.hex + + def to_python(self, value: t.Any) -> t.Any: + return UUID(value) + + +class TagDateTime(JSONTag): + __slots__ = () + key = " d" + + def check(self, value: t.Any) -> bool: + return isinstance(value, datetime) + + def to_json(self, value: t.Any) -> t.Any: + return http_date(value) + + def to_python(self, value: t.Any) -> t.Any: + return parse_date(value) + + +class TaggedJSONSerializer: + """Serializer that uses a tag system to compactly represent objects that + are not JSON types. Passed as the intermediate serializer to + :class:`itsdangerous.Serializer`. + + The following extra types are supported: + + * :class:`dict` + * :class:`tuple` + * :class:`bytes` + * :class:`~markupsafe.Markup` + * :class:`~uuid.UUID` + * :class:`~datetime.datetime` + """ + + __slots__ = ("tags", "order") + + #: Tag classes to bind when creating the serializer. Other tags can be + #: added later using :meth:`~register`. + default_tags = [ + TagDict, + PassDict, + TagTuple, + PassList, + TagBytes, + TagMarkup, + TagUUID, + TagDateTime, + ] + + def __init__(self) -> None: + self.tags: dict[str, JSONTag] = {} + self.order: list[JSONTag] = [] + + for cls in self.default_tags: + self.register(cls) + + def register( + self, + tag_class: type[JSONTag], + force: bool = False, + index: int | None = None, + ) -> None: + """Register a new tag with this serializer. + + :param tag_class: tag class to register. Will be instantiated with this + serializer instance. + :param force: overwrite an existing tag. If false (default), a + :exc:`KeyError` is raised. + :param index: index to insert the new tag in the tag order. Useful when + the new tag is a special case of an existing tag. If ``None`` + (default), the tag is appended to the end of the order. + + :raise KeyError: if the tag key is already registered and ``force`` is + not true. + """ + tag = tag_class(self) + key = tag.key + + if key: + if not force and key in self.tags: + raise KeyError(f"Tag '{key}' is already registered.") + + self.tags[key] = tag + + if index is None: + self.order.append(tag) + else: + self.order.insert(index, tag) + + def tag(self, value: t.Any) -> t.Any: + """Convert a value to a tagged representation if necessary.""" + for tag in self.order: + if tag.check(value): + return tag.tag(value) + + return value + + def untag(self, value: dict[str, t.Any]) -> t.Any: + """Convert a tagged representation back to the original type.""" + if len(value) != 1: + return value + + key = next(iter(value)) + + if key not in self.tags: + return value + + return self.tags[key].to_python(value[key]) + + def _untag_scan(self, value: t.Any) -> t.Any: + if isinstance(value, dict): + # untag each item recursively + value = {k: self._untag_scan(v) for k, v in value.items()} + # untag the dict itself + value = self.untag(value) + elif isinstance(value, list): + # untag each item recursively + value = [self._untag_scan(item) for item in value] + + return value + + def dumps(self, value: t.Any) -> str: + """Tag the value and dump it to a compact JSON string.""" + return dumps(self.tag(value), separators=(",", ":")) + + def loads(self, value: str) -> t.Any: + """Load data from a JSON string and deserialized any tagged objects.""" + return self._untag_scan(loads(value)) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/logging.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/logging.py new file mode 100644 index 00000000..0cb8f437 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/logging.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +import logging +import sys +import typing as t + +from werkzeug.local import LocalProxy + +from .globals import request + +if t.TYPE_CHECKING: # pragma: no cover + from .sansio.app import App + + +@LocalProxy +def wsgi_errors_stream() -> t.TextIO: + """Find the most appropriate error stream for the application. If a request + is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. + + If you configure your own :class:`logging.StreamHandler`, you may want to + use this for the stream. If you are using file or dict configuration and + can't import this directly, you can refer to it as + ``ext://flask.logging.wsgi_errors_stream``. + """ + if request: + return request.environ["wsgi.errors"] # type: ignore[no-any-return] + + return sys.stderr + + +def has_level_handler(logger: logging.Logger) -> bool: + """Check if there is a handler in the logging chain that will handle the + given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. + """ + level = logger.getEffectiveLevel() + current = logger + + while current: + if any(handler.level <= level for handler in current.handlers): + return True + + if not current.propagate: + break + + current = current.parent # type: ignore + + return False + + +#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format +#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. +default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore +default_handler.setFormatter( + logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") +) + + +def create_logger(app: App) -> logging.Logger: + """Get the Flask app's logger and configure it if needed. + + The logger name will be the same as + :attr:`app.import_name `. + + When :attr:`~flask.Flask.debug` is enabled, set the logger level to + :data:`logging.DEBUG` if it is not set. + + If there is no handler for the logger's effective level, add a + :class:`~logging.StreamHandler` for + :func:`~flask.logging.wsgi_errors_stream` with a basic format. + """ + logger = logging.getLogger(app.name) + + if app.debug and not logger.level: + logger.setLevel(logging.DEBUG) + + if not has_level_handler(logger): + logger.addHandler(default_handler) + + return logger diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/py.typed b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/README.md b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/README.md new file mode 100644 index 00000000..623ac198 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/README.md @@ -0,0 +1,6 @@ +# Sansio + +This folder contains code that can be used by alternative Flask +implementations, for example Quart. The code therefore cannot do any +IO, nor be part of a likely IO path. Finally this code cannot use the +Flask globals. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e78d5f28e812edb329d7ae191fc550f41565829e GIT binary patch literal 33715 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 I?mSrk59>BV0{{R3 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9c47d2494c6a54b4805aff32e2920c7b717ab9f GIT binary patch literal 31215 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce389abfa4119c8b9666ef65d3810788c71c2e79 GIT binary patch literal 30225 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 cR}$UtKiBAUt-W8n(Y5u#uxo>BEi timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class App(Scaffold): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + #: The class of the object assigned to :attr:`aborter`, created by + #: :meth:`create_aborter`. That object is called by + #: :func:`flask.abort` to raise HTTP errors, and can be + #: called directly as well. + #: + #: Defaults to :class:`werkzeug.exceptions.Aborter`. + #: + #: .. versionadded:: 2.2 + aborter_class = Aborter + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute[bool]("TESTING") + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute[t.Union[str, bytes, None]]("SECRET_KEY") + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute[timedelta]( + "PERMANENT_SESSION_LIFETIME", + get_converter=_make_timedelta, # type: ignore[arg-type] + ) + + json_provider_class: type[JSONProvider] = DefaultJSONProvider + """A subclass of :class:`~flask.json.provider.JSONProvider`. An + instance is created and assigned to :attr:`app.json` when creating + the app. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses + Python's built-in :mod:`json` library. A different provider can use + a different JSON library. + + .. versionadded:: 2.2 + """ + + #: Options that are passed to the Jinja environment in + #: :meth:`create_jinja_environment`. Changing these options after + #: the environment is created (accessing :attr:`jinja_env`) will + #: have no effect. + #: + #: .. versionchanged:: 1.1.0 + #: This is a ``dict`` instead of an ``ImmutableDict`` to allow + #: easier configuration. + #: + jinja_options: dict[str, t.Any] = {} + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: The map object to use for storing the URL rules and routing + #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. + #: + #: .. versionadded:: 1.1.0 + url_map_class = Map + + #: The :meth:`test_client` method creates an instance of this test + #: client class. Defaults to :class:`~flask.testing.FlaskClient`. + #: + #: .. versionadded:: 0.7 + test_client_class: type[FlaskClient] | None = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class: type[FlaskCliRunner] | None = None + + default_config: dict[str, t.Any] + response_class: type[Response] + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike[str] | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike[str] | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ) -> None: + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + "If an instance path is provided it must be absolute." + " A relative path was given instead." + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: An instance of :attr:`aborter_class` created by + #: :meth:`make_aborter`. This is called by :func:`flask.abort` + #: to raise HTTP errors, and can be called directly as well. + #: + #: .. versionadded:: 2.2 + #: Moved from ``flask.abort``, which calls this object. + self.aborter = self.make_aborter() + + self.json: JSONProvider = self.json_provider_class(self) + """Provides access to JSON methods. Functions in ``flask.json`` + will call methods on this provider when the application context + is active. Used for handling JSON requests and responses. + + An instance of :attr:`json_provider_class`. Can be customized by + changing that attribute on a subclass, or by assigning to this + attribute afterwards. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, + uses Python's built-in :mod:`json` library. A different provider + can use a different JSON library. + + .. versionadded:: 2.2 + """ + + #: A list of functions that are called by + #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function is called + #: with ``error``, ``endpoint`` and ``values``. If a function + #: returns ``None`` or raises a ``BuildError``, it is skipped. + #: Otherwise, its return value is returned by ``url_for``. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers: list[ + t.Callable[[Exception, str, dict[str, t.Any]], str] + ] = [] + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] + + #: Maps registered blueprint names to blueprint objects. The + #: dict retains the order the blueprints were registered in. + #: Blueprints can be registered multiple times, this dict does + #: not track how often they were attached. + #: + #: .. versionadded:: 0.7 + self.blueprints: dict[str, Blueprint] = {} + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions: dict[str, t.Any] = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = self.url_map_class(host_matching=host_matching) + + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_first_request: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called" + " on the application. It has already handled its first" + " request, any changes will not be applied" + " consistently.\n" + "Make sure all imports, decorators, functions, etc." + " needed to set up the application are done before" + " running it." + ) + + @cached_property + def name(self) -> str: # type: ignore + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == "__main__": + fn: str | None = getattr(sys.modules["__main__"], "__file__", None) + if fn is None: + return "__main__" + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @cached_property + def logger(self) -> logging.Logger: + """A standard Python :class:`~logging.Logger` for the app, with + the same name as :attr:`name`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will + be set to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be + added. See :doc:`/logging` for more information. + + .. versionchanged:: 1.1.0 + The logger takes the same name as :attr:`name` rather than + hard-coding ``"flask.app"``. + + .. versionchanged:: 1.0.0 + Behavior was simplified. The logger is always named + ``"flask.app"``. The level is only set during configuration, + it doesn't check ``app.debug`` each time. Only one format is + used, not different ones depending on ``app.debug``. No + handlers are removed, and a handler is only added if no + handlers are already configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @cached_property + def jinja_env(self) -> Environment: + """The Jinja environment used to load templates. + + The environment is created the first time this property is + accessed. Changing :attr:`jinja_options` after that will have no + effect. + """ + return self.create_jinja_environment() + + def create_jinja_environment(self) -> Environment: + raise NotImplementedError() + + def make_config(self, instance_relative: bool = False) -> Config: + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults["DEBUG"] = get_debug_flag() + return self.config_class(root_path, defaults) + + def make_aborter(self) -> Aborter: + """Create the object to assign to :attr:`aborter`. That object + is called by :func:`flask.abort` to raise HTTP errors, and can + be called directly as well. + + By default, this creates an instance of :attr:`aborter_class`, + which defaults to :class:`werkzeug.exceptions.Aborter`. + + .. versionadded:: 2.2 + """ + return self.aborter_class() + + def auto_find_instance_path(self) -> str: + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, "instance") + return os.path.join(prefix, "var", f"{self.name}-instance") + + def create_global_jinja_loader(self) -> DispatchingJinjaLoader: + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename: str) -> bool: + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionchanged:: 2.2 + Autoescaping is now enabled by default for ``.svg`` files. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) + + @property + def debug(self) -> bool: + """Whether debug mode is enabled. When using ``flask run`` to start the + development server, an interactive debugger will be shown for unhandled + exceptions, and the server will be reloaded when code changes. This maps to the + :data:`DEBUG` config key. It may not behave as expected if set late. + + **Do not enable debug mode when deploying in production.** + + Default: ``False`` + """ + return self.config["DEBUG"] # type: ignore[no-any-return] + + @debug.setter + def debug(self, value: bool) -> None: + self.config["DEBUG"] = value + + if self.config["TEMPLATES_AUTO_RELOAD"] is None: + self.jinja_env.auto_reload = value + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 0.7 + """ + blueprint.register(self, options) + + def iter_blueprints(self) -> t.ValuesView[Blueprint]: + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return self.blueprints.values() + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + options["endpoint"] = endpoint + methods = options.pop("methods", None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, "methods", None) or ("GET",) + if isinstance(methods, str): + raise TypeError( + "Allowed methods must be a list of strings, for" + ' example: @app.route(..., methods=["POST"])' + ) + methods = {item.upper() for item in methods} + + # Methods that should always be added + required_methods: set[str] = set(getattr(view_func, "required_methods", ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr( + view_func, "provide_automatic_options", None + ) + + if provide_automatic_options is None: + if "OPTIONS" not in methods and self.config["PROVIDE_AUTOMATIC_OPTIONS"]: + provide_automatic_options = True + required_methods.add("OPTIONS") + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule_obj = self.url_rule_class(rule, methods=methods, **options) + rule_obj.provide_automatic_options = provide_automatic_options # type: ignore[attr-defined] + + self.url_map.add(rule_obj) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError( + "View function mapping is overwriting an existing" + f" endpoint function: {endpoint}" + ) + self.view_functions[endpoint] = view_func + + @setupmethod + def template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def teardown_appcontext(self, f: T_teardown) -> T_teardown: + """Registers a function to be called when the application + context is popped. The application context is typically popped + after the request context for each request, at the end of CLI + commands, or after a manually pushed context ends. + + .. code-block:: python + + with app.app_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the app context is + made inactive. Since a request context typically also manages an + application context it would also be called when you pop a + request context. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def shell_context_processor( + self, f: T_shell_context_processor + ) -> T_shell_context_processor: + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + def _find_error_handler( + self, e: Exception, blueprints: list[str] + ) -> ft.ErrorHandlerCallable | None: + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + names = (*blueprints, None) + + for c in (code, None) if code is not None else (None,): + for name in names: + handler_map = self.error_handler_spec[name][c] + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + return None + + def trap_http_exception(self, e: Exception) -> bool: + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config["TRAP_HTTP_EXCEPTIONS"]: + return True + + trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None + and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def should_ignore_error(self, error: BaseException | None) -> bool: + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def redirect(self, location: str, code: int = 302) -> BaseResponse: + """Create a redirect response object. + + This is called by :func:`flask.redirect`, and can be called + directly as well. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + + .. versionadded:: 2.2 + Moved from ``flask.redirect``, which calls this method. + """ + return _wz_redirect( + location, + code=code, + Response=self.response_class, # type: ignore[arg-type] + ) + + def inject_url_defaults(self, endpoint: str, values: dict[str, t.Any]) -> None: + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + names: t.Iterable[str | None] = (None,) + + # url_for may be called outside a request context, parse the + # passed endpoint instead of using request.blueprints. + if "." in endpoint: + names = chain( + names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) + ) + + for name in names: + if name in self.url_default_functions: + for func in self.url_default_functions[name]: + func(endpoint, values) + + def handle_url_build_error( + self, error: BuildError, endpoint: str, values: dict[str, t.Any] + ) -> str: + """Called by :meth:`.url_for` if a + :exc:`~werkzeug.routing.BuildError` was raised. If this returns + a value, it will be returned by ``url_for``, otherwise the error + will be re-raised. + + Each function in :attr:`url_build_error_handlers` is called with + ``error``, ``endpoint`` and ``values``. If a function returns + ``None`` or raises a ``BuildError``, it is skipped. Otherwise, + its return value is returned by ``url_for``. + + :param error: The active ``BuildError`` being handled. + :param endpoint: The endpoint being built. + :param values: The keyword arguments passed to ``url_for``. + """ + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + except BuildError as e: + # make error available outside except block + error = e + else: + if rv is not None: + return rv + + # Re-raise if called with an active exception, otherwise raise + # the passed in exception. + if error is sys.exc_info()[1]: + raise + + raise error diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py new file mode 100644 index 00000000..4f912cca --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py @@ -0,0 +1,632 @@ +from __future__ import annotations + +import os +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from .. import typing as ft +from .scaffold import _endpoint_from_view_func +from .scaffold import _sentinel +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from .app import App + +DeferredSetupFunction = t.Callable[["BlueprintSetupState"], None] +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) + + +class BlueprintSetupState: + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__( + self, + blueprint: Blueprint, + app: App, + options: t.Any, + first_registration: bool, + ) -> None: + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get("subdomain") + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get("url_prefix") + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + self.name = self.options.get("name", blueprint.name) + self.name_prefix = self.options.get("name_prefix", "") + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get("url_defaults", ())) + + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + **options: t.Any, + ) -> None: + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) + else: + rule = self.url_prefix + options.setdefault("subdomain", self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + defaults = self.url_defaults + if "defaults" in options: + defaults = dict(defaults, **options.pop("defaults")) + + self.app.add_url_rule( + rule, + f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), + view_func, + defaults=defaults, + **options, + ) + + +class Blueprint(Scaffold): + """Represents a blueprint, a collection of routes and other + app-related functions that can be registered on a real application + later. + + A blueprint is an object that allows defining application functions + without requiring an application object ahead of time. It uses the + same decorators as :class:`~flask.Flask`, but defers the need for an + application by recording them for later registration. + + Decorating a function with a blueprint creates a deferred function + that is called with :class:`~flask.blueprints.BlueprintSetupState` + when the blueprint is registered on an application. + + See :doc:`/blueprints` for more information. + + :param name: The name of the blueprint. Will be prepended to each + endpoint name. + :param import_name: The name of the blueprint package, usually + ``__name__``. This helps locate the ``root_path`` for the + blueprint. + :param static_folder: A folder with static files that should be + served by the blueprint's static route. The path is relative to + the blueprint's root path. Blueprint static files are disabled + by default. + :param static_url_path: The url to serve static files from. + Defaults to ``static_folder``. If the blueprint does not have + a ``url_prefix``, the app's static route will take precedence, + and the blueprint's static files won't be accessible. + :param template_folder: A folder with templates that should be added + to the app's template search path. The path is relative to the + blueprint's root path. Blueprint templates are disabled by + default. Blueprint templates have a lower precedence than those + in the app's templates folder. + :param url_prefix: A path to prepend to all of the blueprint's URLs, + to make them distinct from the rest of the app's routes. + :param subdomain: A subdomain that blueprint routes will match on by + default. + :param url_defaults: A dict of default values that blueprint routes + will receive by default. + :param root_path: By default, the blueprint will automatically set + this based on ``import_name``. In certain situations this + automatic detection can fail, so the path can be specified + manually instead. + + .. versionchanged:: 1.1.0 + Blueprints have a ``cli`` group to register nested CLI commands. + The ``cli_group`` parameter controls the name of the group under + the ``flask`` command. + + .. versionadded:: 0.7 + """ + + _got_registered_once = False + + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike[str] | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike[str] | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict[str, t.Any] | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore[assignment] + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if not name: + raise ValueError("'name' may not be empty.") + + if "." in name: + raise ValueError("'name' may not contain a dot '.' character.") + + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.deferred_functions: list[DeferredSetupFunction] = [] + + if url_defaults is None: + url_defaults = {} + + self.url_values_defaults = url_defaults + self.cli_group = cli_group + self._blueprints: list[tuple[Blueprint, dict[str, t.Any]]] = [] + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_registered_once: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called on the blueprint" + f" '{self.name}'. It has already been registered at least once, any" + " changes will not be applied consistently.\n" + "Make sure all imports, decorators, functions, etc. needed to set up" + " the blueprint are done before registering it." + ) + + @setupmethod + def record(self, func: DeferredSetupFunction) -> None: + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + self.deferred_functions.append(func) + + @setupmethod + def record_once(self, func: DeferredSetupFunction) -> None: + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + + def wrapper(state: BlueprintSetupState) -> None: + if state.first_registration: + func(state) + + self.record(update_wrapper(wrapper, func)) + + def make_setup_state( + self, app: App, options: dict[str, t.Any], first_registration: bool = False + ) -> BlueprintSetupState: + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on this blueprint. Keyword + arguments passed to this method will override the defaults set + on the blueprint. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 2.0 + """ + if blueprint is self: + raise ValueError("Cannot register a blueprint on itself") + self._blueprints.append((blueprint, options)) + + def register(self, app: App, options: dict[str, t.Any]) -> None: + """Called by :meth:`Flask.register_blueprint` to register all + views and callbacks registered on the blueprint with the + application. Creates a :class:`.BlueprintSetupState` and calls + each :meth:`record` callback with it. + + :param app: The application this blueprint is being registered + with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + + .. versionchanged:: 2.3 + Nested blueprints now correctly apply subdomains. + + .. versionchanged:: 2.1 + Registering the same blueprint with the same name multiple + times is an error. + + .. versionchanged:: 2.0.1 + Nested blueprints are registered with their dotted name. + This allows different blueprints with the same name to be + nested at different locations. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + """ + name_prefix = options.get("name_prefix", "") + self_name = options.get("name", self.name) + name = f"{name_prefix}.{self_name}".lstrip(".") + + if name in app.blueprints: + bp_desc = "this" if app.blueprints[name] is self else "a different" + existing_at = f" '{name}'" if self_name != name else "" + + raise ValueError( + f"The name '{self_name}' is already registered for" + f" {bp_desc} blueprint{existing_at}. Use 'name=' to" + f" provide a unique name." + ) + + first_bp_registration = not any(bp is self for bp in app.blueprints.values()) + first_name_registration = name not in app.blueprints + + app.blueprints[name] = self + self._got_registered_once = True + state = self.make_setup_state(app, options, first_bp_registration) + + if self.has_static_folder: + state.add_url_rule( + f"{self.static_url_path}/", + view_func=self.send_static_file, # type: ignore[attr-defined] + endpoint="static", + ) + + # Merge blueprint data into parent. + if first_bp_registration or first_name_registration: + self._merge_blueprint_funcs(app, name) + + for deferred in self.deferred_functions: + deferred(state) + + cli_resolved_group = options.get("cli_group", self.cli_group) + + if self.cli.commands: + if cli_resolved_group is None: + app.cli.commands.update(self.cli.commands) + elif cli_resolved_group is _sentinel: + self.cli.name = name + app.cli.add_command(self.cli) + else: + self.cli.name = cli_resolved_group + app.cli.add_command(self.cli) + + for blueprint, bp_options in self._blueprints: + bp_options = bp_options.copy() + bp_url_prefix = bp_options.get("url_prefix") + bp_subdomain = bp_options.get("subdomain") + + if bp_subdomain is None: + bp_subdomain = blueprint.subdomain + + if state.subdomain is not None and bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + "." + state.subdomain + elif bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + elif state.subdomain is not None: + bp_options["subdomain"] = state.subdomain + + if bp_url_prefix is None: + bp_url_prefix = blueprint.url_prefix + + if state.url_prefix is not None and bp_url_prefix is not None: + bp_options["url_prefix"] = ( + state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") + ) + elif bp_url_prefix is not None: + bp_options["url_prefix"] = bp_url_prefix + elif state.url_prefix is not None: + bp_options["url_prefix"] = state.url_prefix + + bp_options["name_prefix"] = name + blueprint.register(app, bp_options) + + def _merge_blueprint_funcs(self, app: App, name: str) -> None: + def extend( + bp_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], + parent_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], + ) -> None: + for key, values in bp_dict.items(): + key = name if key is None else f"{name}.{key}" + parent_dict[key].extend(values) + + for key, value in self.error_handler_spec.items(): + key = name if key is None else f"{name}.{key}" + value = defaultdict( + dict, + { + code: {exc_class: func for exc_class, func in code_values.items()} + for code, code_values in value.items() + }, + ) + app.error_handler_spec[key] = value + + for endpoint, func in self.view_functions.items(): + app.view_functions[endpoint] = func + + extend(self.before_request_funcs, app.before_request_funcs) + extend(self.after_request_funcs, app.after_request_funcs) + extend( + self.teardown_request_funcs, + app.teardown_request_funcs, + ) + extend(self.url_default_functions, app.url_default_functions) + extend(self.url_value_preprocessors, app.url_value_preprocessors) + extend(self.template_context_processors, app.template_context_processors) + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for + full documentation. + + The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, + used with :func:`url_for`, is prefixed with the blueprint's name. + """ + if endpoint and "." in endpoint: + raise ValueError("'endpoint' may not contain a dot '.' character.") + + if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: + raise ValueError("'view_func' name may not contain a dot '.' character.") + + self.record( + lambda s: s.add_url_rule( + rule, + endpoint, + view_func, + provide_automatic_options=provide_automatic_options, + **options, + ) + ) + + @setupmethod + def app_template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """Register a template filter, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_app_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a template filter, available in any template rendered by the + application. Works like the :meth:`app_template_filter` decorator. Equivalent to + :meth:`.Flask.add_template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.filters[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """Register a template test, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_app_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a template test, available in any template rendered by the + application. Works like the :meth:`app_template_test` decorator. Equivalent to + :meth:`.Flask.add_template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.tests[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """Register a template global, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_app_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a template global, available in any template rendered by the + application. Works like the :meth:`app_template_global` decorator. Equivalent to + :meth:`.Flask.add_template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.globals[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def before_app_request(self, f: T_before_request) -> T_before_request: + """Like :meth:`before_request`, but before every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.before_request`. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def after_app_request(self, f: T_after_request) -> T_after_request: + """Like :meth:`after_request`, but after every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.after_request`. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def teardown_app_request(self, f: T_teardown) -> T_teardown: + """Like :meth:`teardown_request`, but after every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_context_processor( + self, f: T_template_context_processor + ) -> T_template_context_processor: + """Like :meth:`context_processor`, but for templates rendered by every view, not + only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_errorhandler( + self, code: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Like :meth:`errorhandler`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.errorhandler`. + """ + + def decorator(f: T_error_handler) -> T_error_handler: + def from_blueprint(state: BlueprintSetupState) -> None: + state.app.errorhandler(code)(f) + + self.record_once(from_blueprint) + return f + + return decorator + + @setupmethod + def app_url_value_preprocessor( + self, f: T_url_value_preprocessor + ) -> T_url_value_preprocessor: + """Like :meth:`url_value_preprocessor`, but for every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. + """ + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Like :meth:`url_defaults`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.url_defaults`. + """ + self.record_once( + lambda s: s.app.url_default_functions.setdefault(None, []).append(f) + ) + return f diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py new file mode 100644 index 00000000..3a839f5a --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py @@ -0,0 +1,792 @@ +from __future__ import annotations + +import importlib.util +import os +import pathlib +import sys +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from jinja2 import BaseLoader +from jinja2 import FileSystemLoader +from werkzeug.exceptions import default_exceptions +from werkzeug.exceptions import HTTPException +from werkzeug.utils import cached_property + +from .. import typing as ft +from ..helpers import get_root_path +from ..templating import _default_template_ctx_processor + +if t.TYPE_CHECKING: # pragma: no cover + from click import Group + +# a singleton sentinel value for parameter defaults +_sentinel = object() + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) +T_route = t.TypeVar("T_route", bound=ft.RouteCallable) + + +def setupmethod(f: F) -> F: + f_name = f.__name__ + + def wrapper_func(self: Scaffold, *args: t.Any, **kwargs: t.Any) -> t.Any: + self._check_setup_finished(f_name) + return f(self, *args, **kwargs) + + return t.cast(F, update_wrapper(wrapper_func, f)) + + +class Scaffold: + """Common behavior shared between :class:`~flask.Flask` and + :class:`~flask.blueprints.Blueprint`. + + :param import_name: The import name of the module where this object + is defined. Usually :attr:`__name__` should be used. + :param static_folder: Path to a folder of static files to serve. + If this is set, a static route will be added. + :param static_url_path: URL prefix for the static route. + :param template_folder: Path to a folder containing template files. + for rendering. If this is set, a Jinja loader will be added. + :param root_path: The path that static, template, and resource files + are relative to. Typically not set, it is discovered based on + the ``import_name``. + + .. versionadded:: 2.0 + """ + + cli: Group + name: str + _static_folder: str | None = None + _static_url_path: str | None = None + + def __init__( + self, + import_name: str, + static_folder: str | os.PathLike[str] | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike[str] | None = None, + root_path: str | None = None, + ): + #: The name of the package or module that this object belongs + #: to. Do not change this once it is set by the constructor. + self.import_name = import_name + + self.static_folder = static_folder # type: ignore + self.static_url_path = static_url_path + + #: The path to the templates folder, relative to + #: :attr:`root_path`, to add to the template loader. ``None`` if + #: templates should not be added. + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + #: Absolute path to the package on the filesystem. Used to look + #: up resources contained in the package. + self.root_path = root_path + + #: A dictionary mapping endpoint names to view functions. + #: + #: To register a view function, use the :meth:`route` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.view_functions: dict[str, ft.RouteCallable] = {} + + #: A data structure of registered error handlers, in the format + #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is + #: the name of a blueprint the handlers are active for, or + #: ``None`` for all requests. The ``code`` key is the HTTP + #: status code for ``HTTPException``, or ``None`` for + #: other exceptions. The innermost dictionary maps exception + #: classes to handler functions. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.error_handler_spec: dict[ + ft.AppOrBlueprintKey, + dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], + ] = defaultdict(lambda: defaultdict(dict)) + + #: A data structure of functions to call at the beginning of + #: each request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`before_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.before_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`after_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.after_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.AfterRequestCallable[t.Any]] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request even if an exception is raised, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`teardown_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.teardown_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.TeardownCallable] + ] = defaultdict(list) + + #: A data structure of functions to call to pass extra context + #: values when rendering templates, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`context_processor` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.template_context_processors: dict[ + ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] + ] = defaultdict(list, {None: [_default_template_ctx_processor]}) + + #: A data structure of functions to call to modify the keyword + #: arguments passed to the view function, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the + #: :meth:`url_value_preprocessor` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_value_preprocessors: dict[ + ft.AppOrBlueprintKey, + list[ft.URLValuePreprocessorCallable], + ] = defaultdict(list) + + #: A data structure of functions to call to modify the keyword + #: arguments when generating URLs, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`url_defaults` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_default_functions: dict[ + ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] + ] = defaultdict(list) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.name!r}>" + + def _check_setup_finished(self, f_name: str) -> None: + raise NotImplementedError + + @property + def static_folder(self) -> str | None: + """The absolute path to the configured static folder. ``None`` + if no static folder is set. + """ + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + else: + return None + + @static_folder.setter + def static_folder(self, value: str | os.PathLike[str] | None) -> None: + if value is not None: + value = os.fspath(value).rstrip(r"\/") + + self._static_folder = value + + @property + def has_static_folder(self) -> bool: + """``True`` if :attr:`static_folder` is set. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @property + def static_url_path(self) -> str | None: + """The URL prefix that the static route will be accessible from. + + If it was not configured during init, it is derived from + :attr:`static_folder`. + """ + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + basename = os.path.basename(self.static_folder) + return f"/{basename}".rstrip("/") + + return None + + @static_url_path.setter + def static_url_path(self, value: str | None) -> None: + if value is not None: + value = value.rstrip("/") + + self._static_url_path = value + + @cached_property + def jinja_loader(self) -> BaseLoader | None: + """The Jinja loader for this object's templates. By default this + is a class :class:`jinja2.loaders.FileSystemLoader` to + :attr:`template_folder` if it is set. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) + else: + return None + + def _method_route( + self, + method: str, + rule: str, + options: dict[str, t.Any], + ) -> t.Callable[[T_route], T_route]: + if "methods" in options: + raise TypeError("Use the 'route' decorator to use the 'methods' argument.") + + return self.route(rule, methods=[method], **options) + + @setupmethod + def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["GET"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("GET", rule, options) + + @setupmethod + def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["POST"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("POST", rule, options) + + @setupmethod + def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PUT"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PUT", rule, options) + + @setupmethod + def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["DELETE"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("DELETE", rule, options) + + @setupmethod + def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PATCH"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PATCH", rule, options) + + @setupmethod + def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Decorate a view function to register it with the given URL + rule and options. Calls :meth:`add_url_rule`, which has more + details about the implementation. + + .. code-block:: python + + @app.route("/") + def index(): + return "Hello, World!" + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and + ``OPTIONS`` are added automatically. + + :param rule: The URL rule string. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + + def decorator(f: T_route) -> T_route: + endpoint = options.pop("endpoint", None) + self.add_url_rule(rule, endpoint, f, **options) + return f + + return decorator + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a rule for routing incoming requests and building + URLs. The :meth:`route` decorator is a shortcut to call this + with the ``view_func`` argument. These are equivalent: + + .. code-block:: python + + @app.route("/") + def index(): + ... + + .. code-block:: python + + def index(): + ... + + app.add_url_rule("/", view_func=index) + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. An error + will be raised if a function has already been registered for the + endpoint. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is + always added automatically, and ``OPTIONS`` is added + automatically by default. + + ``view_func`` does not necessarily need to be passed, but if the + rule should participate in routing an endpoint name must be + associated with a view function at some point with the + :meth:`endpoint` decorator. + + .. code-block:: python + + app.add_url_rule("/", endpoint="index") + + @app.endpoint("index") + def index(): + ... + + If ``view_func`` has a ``required_methods`` attribute, those + methods are added to the passed and automatic methods. If it + has a ``provide_automatic_methods`` attribute, it is used as the + default if the parameter is not passed. + + :param rule: The URL rule string. + :param endpoint: The endpoint name to associate with the rule + and view function. Used when routing and building URLs. + Defaults to ``view_func.__name__``. + :param view_func: The view function to associate with the + endpoint name. + :param provide_automatic_options: Add the ``OPTIONS`` method and + respond to ``OPTIONS`` requests automatically. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + raise NotImplementedError + + @setupmethod + def endpoint(self, endpoint: str) -> t.Callable[[F], F]: + """Decorate a view function to register it for the given + endpoint. Used if a rule is added without a ``view_func`` with + :meth:`add_url_rule`. + + .. code-block:: python + + app.add_url_rule("/ex", endpoint="example") + + @app.endpoint("example") + def example(): + ... + + :param endpoint: The endpoint name to associate with the view + function. + """ + + def decorator(f: F) -> F: + self.view_functions[endpoint] = f + return f + + return decorator + + @setupmethod + def before_request(self, f: T_before_request) -> T_before_request: + """Register a function to run before each request. + + For example, this can be used to open a database connection, or + to load the logged in user from the session. + + .. code-block:: python + + @app.before_request + def load_user(): + if "user_id" in session: + g.user = db.session.get(session["user_id"]) + + The function will be called without any arguments. If it returns + a non-``None`` value, the value is handled as if it was the + return value from the view, and further request handling is + stopped. + + This is available on both app and blueprint objects. When used on an app, this + executes before every request. When used on a blueprint, this executes before + every request that the blueprint handles. To register with a blueprint and + execute before every request, use :meth:`.Blueprint.before_app_request`. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def after_request(self, f: T_after_request) -> T_after_request: + """Register a function to run after each request to this object. + + The function is called with the response object, and must return + a response object. This allows the functions to modify or + replace the response before it is sent. + + If a function raises an exception, any remaining + ``after_request`` functions will not be called. Therefore, this + should not be used for actions that must execute, such as to + close resources. Use :meth:`teardown_request` for that. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.after_app_request`. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f: T_teardown) -> T_teardown: + """Register a function to be called when the request context is + popped. Typically this happens at the end of each request, but + contexts may be pushed manually as well during testing. + + .. code-block:: python + + with app.test_request_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the request context is + made inactive. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.teardown_app_request`. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def context_processor( + self, + f: T_template_context_processor, + ) -> T_template_context_processor: + """Registers a template context processor function. These functions run before + rendering a template. The keys of the returned dict are added as variables + available in the template. + + This is available on both app and blueprint objects. When used on an app, this + is called for every rendered template. When used on a blueprint, this is called + for templates rendered from the blueprint's views. To register with a blueprint + and affect every template, use :meth:`.Blueprint.app_context_processor`. + """ + self.template_context_processors[None].append(f) + return f + + @setupmethod + def url_value_preprocessor( + self, + f: T_url_value_preprocessor, + ) -> T_url_value_preprocessor: + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_value_preprocessor`. + """ + self.url_value_preprocessors[None].append(f) + return f + + @setupmethod + def url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_defaults`. + """ + self.url_default_functions[None].append(f) + return f + + @setupmethod + def errorhandler( + self, code_or_exception: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + This is available on both app and blueprint objects. When used on an app, this + can handle errors from every request. When used on a blueprint, this can handle + errors from requests that the blueprint handles. To register with a blueprint + and affect every request, use :meth:`.Blueprint.app_errorhandler`. + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.register_error_handler(code_or_exception, f) + return f + + return decorator + + @setupmethod + def register_error_handler( + self, + code_or_exception: type[Exception] | int, + f: ft.ErrorHandlerCallable, + ) -> None: + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + exc_class, code = self._get_exc_class_and_code(code_or_exception) + self.error_handler_spec[None][code][exc_class] = f + + @staticmethod + def _get_exc_class_and_code( + exc_class_or_code: type[Exception] | int, + ) -> tuple[type[Exception], int | None]: + """Get the exception class being handled. For HTTP status codes + or ``HTTPException`` subclasses, return both the exception and + status code. + + :param exc_class_or_code: Any exception class, or an HTTP status + code as an integer. + """ + exc_class: type[Exception] + + if isinstance(exc_class_or_code, int): + try: + exc_class = default_exceptions[exc_class_or_code] + except KeyError: + raise ValueError( + f"'{exc_class_or_code}' is not a recognized HTTP" + " error code. Use a subclass of HTTPException with" + " that code instead." + ) from None + else: + exc_class = exc_class_or_code + + if isinstance(exc_class, Exception): + raise TypeError( + f"{exc_class!r} is an instance, not a class. Handlers" + " can only be registered for Exception classes or HTTP" + " error codes." + ) + + if not issubclass(exc_class, Exception): + raise ValueError( + f"'{exc_class.__name__}' is not a subclass of Exception." + " Handlers can only be registered for Exception classes" + " or HTTP error codes." + ) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + +def _endpoint_from_view_func(view_func: ft.RouteCallable) -> str: + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, "expected view func if endpoint is not provided." + return view_func.__name__ + + +def _find_package_path(import_name: str) -> str: + """Find the path that contains the package or module.""" + root_mod_name, _, _ = import_name.partition(".") + + try: + root_spec = importlib.util.find_spec(root_mod_name) + + if root_spec is None: + raise ValueError("not found") + except (ImportError, ValueError): + # ImportError: the machinery told us it does not exist + # ValueError: + # - the module name was invalid + # - the module name is __main__ + # - we raised `ValueError` due to `root_spec` being `None` + return os.getcwd() + + if root_spec.submodule_search_locations: + if root_spec.origin is None or root_spec.origin == "namespace": + # namespace package + package_spec = importlib.util.find_spec(import_name) + + if package_spec is not None and package_spec.submodule_search_locations: + # Pick the path in the namespace that contains the submodule. + package_path = pathlib.Path( + os.path.commonpath(package_spec.submodule_search_locations) + ) + search_location = next( + location + for location in root_spec.submodule_search_locations + if package_path.is_relative_to(location) + ) + else: + # Pick the first path. + search_location = root_spec.submodule_search_locations[0] + + return os.path.dirname(search_location) + else: + # package with __init__.py + return os.path.dirname(os.path.dirname(root_spec.origin)) + else: + # module + return os.path.dirname(root_spec.origin) # type: ignore[type-var, return-value] + + +def find_package(import_name: str) -> tuple[str | None, str]: + """Find the prefix that a package is installed under, and the path + that it would be imported from. + + The prefix is the directory containing the standard directory + hierarchy (lib, bin, etc.). If the package is not installed to the + system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), + ``None`` is returned. + + The path is the entry in :attr:`sys.path` that contains the package + for import. If the package is not installed, it's assumed that the + package was imported from the current working directory. + """ + package_path = _find_package_path(import_name) + py_prefix = os.path.abspath(sys.prefix) + + # installed to the system + if pathlib.PurePath(package_path).is_relative_to(py_prefix): + return py_prefix, package_path + + site_parent, site_folder = os.path.split(package_path) + + # installed to a virtualenv + if site_folder.lower() == "site-packages": + parent, folder = os.path.split(site_parent) + + # Windows (prefix/lib/site-packages) + if folder.lower() == "lib": + return parent, package_path + + # Unix (prefix/lib/pythonX.Y/site-packages) + if os.path.basename(parent).lower() == "lib": + return os.path.dirname(parent), package_path + + # something else (prefix/site-packages) + return site_parent, package_path + + # not installed + return None, package_path diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sessions.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sessions.py new file mode 100644 index 00000000..375de065 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/sessions.py @@ -0,0 +1,398 @@ +from __future__ import annotations + +import collections.abc as c +import hashlib +import typing as t +from collections.abc import MutableMapping +from datetime import datetime +from datetime import timezone + +from itsdangerous import BadSignature +from itsdangerous import URLSafeTimedSerializer +from werkzeug.datastructures import CallbackDict + +from .json.tag import TaggedJSONSerializer + +if t.TYPE_CHECKING: # pragma: no cover + import typing_extensions as te + + from .app import Flask + from .wrappers import Request + from .wrappers import Response + + +class SessionMixin(MutableMapping[str, t.Any]): + """Expands a basic dictionary with session attributes.""" + + @property + def permanent(self) -> bool: + """This reflects the ``'_permanent'`` key in the dict.""" + return self.get("_permanent", False) + + @permanent.setter + def permanent(self, value: bool) -> None: + self["_permanent"] = bool(value) + + #: Some implementations can detect whether a session is newly + #: created, but that is not guaranteed. Use with caution. The mixin + # default is hard-coded ``False``. + new = False + + #: Some implementations can detect changes to the session and set + #: this when that happens. The mixin default is hard coded to + #: ``True``. + modified = True + + #: Some implementations can detect when session data is read or + #: written and set this when that happens. The mixin default is hard + #: coded to ``True``. + accessed = True + + +class SecureCookieSession(CallbackDict[str, t.Any], SessionMixin): + """Base class for sessions based on signed cookies. + + This session backend will set the :attr:`modified` and + :attr:`accessed` attributes. It cannot reliably track whether a + session is new (vs. empty), so :attr:`new` remains hard coded to + ``False``. + """ + + #: When data is changed, this is set to ``True``. Only the session + #: dictionary itself is tracked; if the session contains mutable + #: data (for example a nested dict) then this must be set to + #: ``True`` manually when modifying that data. The session cookie + #: will only be written to the response if this is ``True``. + modified = False + + #: When data is read or written, this is set to ``True``. Used by + # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` + #: header, which allows caching proxies to cache different pages for + #: different users. + accessed = False + + def __init__( + self, + initial: c.Mapping[str, t.Any] | c.Iterable[tuple[str, t.Any]] | None = None, + ) -> None: + def on_update(self: te.Self) -> None: + self.modified = True + self.accessed = True + + super().__init__(initial, on_update) + + def __getitem__(self, key: str) -> t.Any: + self.accessed = True + return super().__getitem__(key) + + def get(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().get(key, default) + + def setdefault(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().setdefault(key, default) + + +class NullSession(SecureCookieSession): + """Class used to generate nicer error messages if sessions are not + available. Will still allow read-only access to the empty session + but fail on setting. + """ + + def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + raise RuntimeError( + "The session is unavailable because no secret " + "key was set. Set the secret_key on the " + "application to something unique and secret." + ) + + __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 + del _fail + + +class SessionInterface: + """The basic interface you have to implement in order to replace the + default session interface which uses werkzeug's securecookie + implementation. The only methods you have to implement are + :meth:`open_session` and :meth:`save_session`, the others have + useful defaults which you don't need to change. + + The session object returned by the :meth:`open_session` method has to + provide a dictionary like interface plus the properties and methods + from the :class:`SessionMixin`. We recommend just subclassing a dict + and adding that mixin:: + + class Session(dict, SessionMixin): + pass + + If :meth:`open_session` returns ``None`` Flask will call into + :meth:`make_null_session` to create a session that acts as replacement + if the session support cannot work because some requirement is not + fulfilled. The default :class:`NullSession` class that is created + will complain that the secret key was not set. + + To replace the session interface on an application all you have to do + is to assign :attr:`flask.Flask.session_interface`:: + + app = Flask(__name__) + app.session_interface = MySessionInterface() + + Multiple requests with the same session may be sent and handled + concurrently. When implementing a new session interface, consider + whether reads or writes to the backing store must be synchronized. + There is no guarantee on the order in which the session for each + request is opened or saved, it will occur in the order that requests + begin and end processing. + + .. versionadded:: 0.8 + """ + + #: :meth:`make_null_session` will look here for the class that should + #: be created when a null session is requested. Likewise the + #: :meth:`is_null_session` method will perform a typecheck against + #: this type. + null_session_class = NullSession + + #: A flag that indicates if the session interface is pickle based. + #: This can be used by Flask extensions to make a decision in regards + #: to how to deal with the session object. + #: + #: .. versionadded:: 0.10 + pickle_based = False + + def make_null_session(self, app: Flask) -> NullSession: + """Creates a null session which acts as a replacement object if the + real session support could not be loaded due to a configuration + error. This mainly aids the user experience because the job of the + null session is to still support lookup without complaining but + modifications are answered with a helpful error message of what + failed. + + This creates an instance of :attr:`null_session_class` by default. + """ + return self.null_session_class() + + def is_null_session(self, obj: object) -> bool: + """Checks if a given object is a null session. Null sessions are + not asked to be saved. + + This checks if the object is an instance of :attr:`null_session_class` + by default. + """ + return isinstance(obj, self.null_session_class) + + def get_cookie_name(self, app: Flask) -> str: + """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" + return app.config["SESSION_COOKIE_NAME"] # type: ignore[no-any-return] + + def get_cookie_domain(self, app: Flask) -> str | None: + """The value of the ``Domain`` parameter on the session cookie. If not set, + browsers will only send the cookie to the exact domain it was set from. + Otherwise, they will send it to any subdomain of the given value as well. + + Uses the :data:`SESSION_COOKIE_DOMAIN` config. + + .. versionchanged:: 2.3 + Not set by default, does not fall back to ``SERVER_NAME``. + """ + return app.config["SESSION_COOKIE_DOMAIN"] # type: ignore[no-any-return] + + def get_cookie_path(self, app: Flask) -> str: + """Returns the path for which the cookie should be valid. The + default implementation uses the value from the ``SESSION_COOKIE_PATH`` + config var if it's set, and falls back to ``APPLICATION_ROOT`` or + uses ``/`` if it's ``None``. + """ + return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] # type: ignore[no-any-return] + + def get_cookie_httponly(self, app: Flask) -> bool: + """Returns True if the session cookie should be httponly. This + currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` + config var. + """ + return app.config["SESSION_COOKIE_HTTPONLY"] # type: ignore[no-any-return] + + def get_cookie_secure(self, app: Flask) -> bool: + """Returns True if the cookie should be secure. This currently + just returns the value of the ``SESSION_COOKIE_SECURE`` setting. + """ + return app.config["SESSION_COOKIE_SECURE"] # type: ignore[no-any-return] + + def get_cookie_samesite(self, app: Flask) -> str | None: + """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the + ``SameSite`` attribute. This currently just returns the value of + the :data:`SESSION_COOKIE_SAMESITE` setting. + """ + return app.config["SESSION_COOKIE_SAMESITE"] # type: ignore[no-any-return] + + def get_cookie_partitioned(self, app: Flask) -> bool: + """Returns True if the cookie should be partitioned. By default, uses + the value of :data:`SESSION_COOKIE_PARTITIONED`. + + .. versionadded:: 3.1 + """ + return app.config["SESSION_COOKIE_PARTITIONED"] # type: ignore[no-any-return] + + def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: + """A helper method that returns an expiration date for the session + or ``None`` if the session is linked to the browser session. The + default implementation returns now + the permanent session + lifetime configured on the application. + """ + if session.permanent: + return datetime.now(timezone.utc) + app.permanent_session_lifetime + return None + + def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: + """Used by session backends to determine if a ``Set-Cookie`` header + should be set for this session cookie for this response. If the session + has been modified, the cookie is set. If the session is permanent and + the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is + always set. + + This check is usually skipped if the session was deleted. + + .. versionadded:: 0.11 + """ + + return session.modified or ( + session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] + ) + + def open_session(self, app: Flask, request: Request) -> SessionMixin | None: + """This is called at the beginning of each request, after + pushing the request context, before matching the URL. + + This must return an object which implements a dictionary-like + interface as well as the :class:`SessionMixin` interface. + + This will return ``None`` to indicate that loading failed in + some way that is not immediately an error. The request + context will fall back to using :meth:`make_null_session` + in this case. + """ + raise NotImplementedError() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + """This is called at the end of each request, after generating + a response, before removing the request context. It is skipped + if :meth:`is_null_session` returns ``True``. + """ + raise NotImplementedError() + + +session_json_serializer = TaggedJSONSerializer() + + +def _lazy_sha1(string: bytes = b"") -> t.Any: + """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include + SHA-1, in which case the import and use as a default would fail before the + developer can configure something else. + """ + return hashlib.sha1(string) + + +class SecureCookieSessionInterface(SessionInterface): + """The default session interface that stores sessions in signed cookies + through the :mod:`itsdangerous` module. + """ + + #: the salt that should be applied on top of the secret key for the + #: signing of cookie based sessions. + salt = "cookie-session" + #: the hash function to use for the signature. The default is sha1 + digest_method = staticmethod(_lazy_sha1) + #: the name of the itsdangerous supported key derivation. The default + #: is hmac. + key_derivation = "hmac" + #: A python serializer for the payload. The default is a compact + #: JSON derived serializer with support for some extra Python types + #: such as datetime objects or tuples. + serializer = session_json_serializer + session_class = SecureCookieSession + + def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: + if not app.secret_key: + return None + + keys: list[str | bytes] = [app.secret_key] + + if fallbacks := app.config["SECRET_KEY_FALLBACKS"]: + keys.extend(fallbacks) + + return URLSafeTimedSerializer( + keys, # type: ignore[arg-type] + salt=self.salt, + serializer=self.serializer, + signer_kwargs={ + "key_derivation": self.key_derivation, + "digest_method": self.digest_method, + }, + ) + + def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: + s = self.get_signing_serializer(app) + if s is None: + return None + val = request.cookies.get(self.get_cookie_name(app)) + if not val: + return self.session_class() + max_age = int(app.permanent_session_lifetime.total_seconds()) + try: + data = s.loads(val, max_age=max_age) + return self.session_class(data) + except BadSignature: + return self.session_class() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + name = self.get_cookie_name(app) + domain = self.get_cookie_domain(app) + path = self.get_cookie_path(app) + secure = self.get_cookie_secure(app) + partitioned = self.get_cookie_partitioned(app) + samesite = self.get_cookie_samesite(app) + httponly = self.get_cookie_httponly(app) + + # Add a "Vary: Cookie" header if the session was accessed at all. + if session.accessed: + response.vary.add("Cookie") + + # If the session is modified to be empty, remove the cookie. + # If the session is empty, return without setting the cookie. + if not session: + if session.modified: + response.delete_cookie( + name, + domain=domain, + path=path, + secure=secure, + partitioned=partitioned, + samesite=samesite, + httponly=httponly, + ) + response.vary.add("Cookie") + + return + + if not self.should_set_cookie(app, session): + return + + expires = self.get_expiration_time(app, session) + val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore[union-attr] + response.set_cookie( + name, + val, + expires=expires, + httponly=httponly, + domain=domain, + path=path, + secure=secure, + partitioned=partitioned, + samesite=samesite, + ) + response.vary.add("Cookie") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/signals.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/signals.py new file mode 100644 index 00000000..444fda99 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/signals.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from blinker import Namespace + +# This namespace is only for signals provided by Flask itself. +_signals = Namespace() + +template_rendered = _signals.signal("template-rendered") +before_render_template = _signals.signal("before-render-template") +request_started = _signals.signal("request-started") +request_finished = _signals.signal("request-finished") +request_tearing_down = _signals.signal("request-tearing-down") +got_request_exception = _signals.signal("got-request-exception") +appcontext_tearing_down = _signals.signal("appcontext-tearing-down") +appcontext_pushed = _signals.signal("appcontext-pushed") +appcontext_popped = _signals.signal("appcontext-popped") +message_flashed = _signals.signal("message-flashed") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/templating.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/templating.py new file mode 100644 index 00000000..618a3b35 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/templating.py @@ -0,0 +1,219 @@ +from __future__ import annotations + +import typing as t + +from jinja2 import BaseLoader +from jinja2 import Environment as BaseEnvironment +from jinja2 import Template +from jinja2 import TemplateNotFound + +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .helpers import stream_with_context +from .signals import before_render_template +from .signals import template_rendered + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .sansio.app import App + from .sansio.scaffold import Scaffold + + +def _default_template_ctx_processor() -> dict[str, t.Any]: + """Default template context processor. Injects `request`, + `session` and `g`. + """ + appctx = _cv_app.get(None) + reqctx = _cv_request.get(None) + rv: dict[str, t.Any] = {} + if appctx is not None: + rv["g"] = appctx.g + if reqctx is not None: + rv["request"] = reqctx.request + rv["session"] = reqctx.session + return rv + + +class Environment(BaseEnvironment): + """Works like a regular Jinja2 environment but has some additional + knowledge of how Flask's blueprint works so that it can prepend the + name of the blueprint to referenced templates if necessary. + """ + + def __init__(self, app: App, **options: t.Any) -> None: + if "loader" not in options: + options["loader"] = app.create_global_jinja_loader() + BaseEnvironment.__init__(self, **options) + self.app = app + + +class DispatchingJinjaLoader(BaseLoader): + """A loader that looks for templates in the application and all + the blueprint folders. + """ + + def __init__(self, app: App) -> None: + self.app = app + + def get_source( + self, environment: BaseEnvironment, template: str + ) -> tuple[str, str | None, t.Callable[[], bool] | None]: + if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: + return self._get_source_explained(environment, template) + return self._get_source_fast(environment, template) + + def _get_source_explained( + self, environment: BaseEnvironment, template: str + ) -> tuple[str, str | None, t.Callable[[], bool] | None]: + attempts = [] + rv: tuple[str, str | None, t.Callable[[], bool] | None] | None + trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None + + for srcobj, loader in self._iter_loaders(template): + try: + rv = loader.get_source(environment, template) + if trv is None: + trv = rv + except TemplateNotFound: + rv = None + attempts.append((loader, srcobj, rv)) + + from .debughelpers import explain_template_loading_attempts + + explain_template_loading_attempts(self.app, template, attempts) + + if trv is not None: + return trv + raise TemplateNotFound(template) + + def _get_source_fast( + self, environment: BaseEnvironment, template: str + ) -> tuple[str, str | None, t.Callable[[], bool] | None]: + for _srcobj, loader in self._iter_loaders(template): + try: + return loader.get_source(environment, template) + except TemplateNotFound: + continue + raise TemplateNotFound(template) + + def _iter_loaders(self, template: str) -> t.Iterator[tuple[Scaffold, BaseLoader]]: + loader = self.app.jinja_loader + if loader is not None: + yield self.app, loader + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + yield blueprint, loader + + def list_templates(self) -> list[str]: + result = set() + loader = self.app.jinja_loader + if loader is not None: + result.update(loader.list_templates()) + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + for template in loader.list_templates(): + result.add(template) + + return list(result) + + +def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + rv = template.render(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + return rv + + +def render_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> str: + """Render a template by name with the given context. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _render(app, template, context) + + +def render_template_string(source: str, **context: t.Any) -> str: + """Render a template from the given source string with the given + context. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _render(app, template, context) + + +def _stream( + app: Flask, template: Template, context: dict[str, t.Any] +) -> t.Iterator[str]: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + def generate() -> t.Iterator[str]: + yield from template.generate(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + rv = generate() + + # If a request context is active, keep it while generating. + if request: + rv = stream_with_context(rv) + + return rv + + +def stream_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> t.Iterator[str]: + """Render a template by name with the given context as a stream. + This returns an iterator of strings, which can be used as a + streaming response from a view. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _stream(app, template, context) + + +def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: + """Render a template from the given source string with the given + context as a stream. This returns an iterator of strings, which can + be used as a streaming response from a view. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _stream(app, template, context) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/testing.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/testing.py new file mode 100644 index 00000000..602b773b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/testing.py @@ -0,0 +1,297 @@ +from __future__ import annotations + +import importlib.metadata +import typing as t +from contextlib import contextmanager +from contextlib import ExitStack +from copy import copy +from types import TracebackType +from urllib.parse import urlsplit + +import werkzeug.test +from click.testing import CliRunner +from werkzeug.test import Client +from werkzeug.wrappers import Request as BaseRequest + +from .cli import ScriptInfo +from .sessions import SessionMixin + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIEnvironment + from werkzeug.test import TestResponse + + from .app import Flask + + +class EnvironBuilder(werkzeug.test.EnvironBuilder): + """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the + application. + + :param app: The Flask application to configure the environment from. + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + + def __init__( + self, + app: Flask, + path: str = "/", + base_url: str | None = None, + subdomain: str | None = None, + url_scheme: str | None = None, + *args: t.Any, + **kwargs: t.Any, + ) -> None: + assert not (base_url or subdomain or url_scheme) or ( + base_url is not None + ) != bool( + subdomain or url_scheme + ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' + + if base_url is None: + http_host = app.config.get("SERVER_NAME") or "localhost" + app_root = app.config["APPLICATION_ROOT"] + + if subdomain: + http_host = f"{subdomain}.{http_host}" + + if url_scheme is None: + url_scheme = app.config["PREFERRED_URL_SCHEME"] + + url = urlsplit(path) + base_url = ( + f"{url.scheme or url_scheme}://{url.netloc or http_host}" + f"/{app_root.lstrip('/')}" + ) + path = url.path + + if url.query: + path = f"{path}?{url.query}" + + self.app = app + super().__init__(path, base_url, *args, **kwargs) + + def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore + """Serialize ``obj`` to a JSON-formatted string. + + The serialization will be configured according to the config associated + with this EnvironBuilder's ``app``. + """ + return self.app.json.dumps(obj, **kwargs) + + +_werkzeug_version = "" + + +def _get_werkzeug_version() -> str: + global _werkzeug_version + + if not _werkzeug_version: + _werkzeug_version = importlib.metadata.version("werkzeug") + + return _werkzeug_version + + +class FlaskClient(Client): + """Works like a regular Werkzeug test client but has knowledge about + Flask's contexts to defer the cleanup of the request context until + the end of a ``with`` block. For general information about how to + use this class refer to :class:`werkzeug.test.Client`. + + .. versionchanged:: 0.12 + `app.test_client()` includes preset default environment, which can be + set after instantiation of the `app.test_client()` object in + `client.environ_base`. + + Basic usage is outlined in the :doc:`/testing` chapter. + """ + + application: Flask + + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + super().__init__(*args, **kwargs) + self.preserve_context = False + self._new_contexts: list[t.ContextManager[t.Any]] = [] + self._context_stack = ExitStack() + self.environ_base = { + "REMOTE_ADDR": "127.0.0.1", + "HTTP_USER_AGENT": f"Werkzeug/{_get_werkzeug_version()}", + } + + @contextmanager + def session_transaction( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Iterator[SessionMixin]: + """When used in combination with a ``with`` statement this opens a + session transaction. This can be used to modify the session that + the test client uses. Once the ``with`` block is left the session is + stored back. + + :: + + with client.session_transaction() as session: + session['value'] = 42 + + Internally this is implemented by going through a temporary test + request context and since session handling could depend on + request variables this function accepts the same arguments as + :meth:`~flask.Flask.test_request_context` which are directly + passed through. + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + app = self.application + ctx = app.test_request_context(*args, **kwargs) + self._add_cookies_to_wsgi(ctx.request.environ) + + with ctx: + sess = app.session_interface.open_session(app, ctx.request) + + if sess is None: + raise RuntimeError("Session backend did not open a session.") + + yield sess + resp = app.response_class() + + if app.session_interface.is_null_session(sess): + return + + with ctx: + app.session_interface.save_session(app, sess, resp) + + self._update_cookies_from_response( + ctx.request.host.partition(":")[0], + ctx.request.path, + resp.headers.getlist("Set-Cookie"), + ) + + def _copy_environ(self, other: WSGIEnvironment) -> WSGIEnvironment: + out = {**self.environ_base, **other} + + if self.preserve_context: + out["werkzeug.debug.preserve_context"] = self._new_contexts.append + + return out + + def _request_from_builder_args( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> BaseRequest: + kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) + builder = EnvironBuilder(self.application, *args, **kwargs) + + try: + return builder.get_request() + finally: + builder.close() + + def open( + self, + *args: t.Any, + buffered: bool = False, + follow_redirects: bool = False, + **kwargs: t.Any, + ) -> TestResponse: + if args and isinstance( + args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) + ): + if isinstance(args[0], werkzeug.test.EnvironBuilder): + builder = copy(args[0]) + builder.environ_base = self._copy_environ(builder.environ_base or {}) # type: ignore[arg-type] + request = builder.get_request() + elif isinstance(args[0], dict): + request = EnvironBuilder.from_environ( + args[0], app=self.application, environ_base=self._copy_environ({}) + ).get_request() + else: + # isinstance(args[0], BaseRequest) + request = copy(args[0]) + request.environ = self._copy_environ(request.environ) + else: + # request is None + request = self._request_from_builder_args(args, kwargs) + + # Pop any previously preserved contexts. This prevents contexts + # from being preserved across redirects or multiple requests + # within a single block. + self._context_stack.close() + + response = super().open( + request, + buffered=buffered, + follow_redirects=follow_redirects, + ) + response.json_module = self.application.json # type: ignore[assignment] + + # Re-push contexts that were preserved during the request. + while self._new_contexts: + cm = self._new_contexts.pop() + self._context_stack.enter_context(cm) + + return response + + def __enter__(self) -> FlaskClient: + if self.preserve_context: + raise RuntimeError("Cannot nest client invocations") + self.preserve_context = True + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.preserve_context = False + self._context_stack.close() + + +class FlaskCliRunner(CliRunner): + """A :class:`~click.testing.CliRunner` for testing a Flask app's + CLI commands. Typically created using + :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. + """ + + def __init__(self, app: Flask, **kwargs: t.Any) -> None: + self.app = app + super().__init__(**kwargs) + + def invoke( # type: ignore + self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any + ) -> t.Any: + """Invokes a CLI command in an isolated environment. See + :meth:`CliRunner.invoke ` for + full method documentation. See :ref:`testing-cli` for examples. + + If the ``obj`` argument is not given, passes an instance of + :class:`~flask.cli.ScriptInfo` that knows how to load the Flask + app being tested. + + :param cli: Command object to invoke. Default is the app's + :attr:`~flask.app.Flask.cli` group. + :param args: List of strings to invoke the command with. + + :return: a :class:`~click.testing.Result` object. + """ + if cli is None: + cli = self.app.cli + + if "obj" not in kwargs: + kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) + + return super().invoke(cli, args, **kwargs) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/typing.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/typing.py new file mode 100644 index 00000000..e7234e96 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/typing.py @@ -0,0 +1,90 @@ +from __future__ import annotations + +import typing as t + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIApplication # noqa: F401 + from werkzeug.datastructures import Headers # noqa: F401 + from werkzeug.sansio.response import Response # noqa: F401 + +# The possible types that are directly convertible or are a Response object. +ResponseValue = t.Union[ + "Response", + str, + bytes, + list[t.Any], + # Only dict is actually accepted, but Mapping allows for TypedDict. + t.Mapping[str, t.Any], + t.Iterator[str], + t.Iterator[bytes], +] + +# the possible types for an individual HTTP header +# This should be a Union, but mypy doesn't pass unless it's a TypeVar. +HeaderValue = t.Union[str, list[str], tuple[str, ...]] + +# the possible types for HTTP headers +HeadersValue = t.Union[ + "Headers", + t.Mapping[str, HeaderValue], + t.Sequence[tuple[str, HeaderValue]], +] + +# The possible types returned by a route function. +ResponseReturnValue = t.Union[ + ResponseValue, + tuple[ResponseValue, HeadersValue], + tuple[ResponseValue, int], + tuple[ResponseValue, int, HeadersValue], + "WSGIApplication", +] + +# Allow any subclass of werkzeug.Response, such as the one from Flask, +# as a callback argument. Using werkzeug.Response directly makes a +# callback annotated with flask.Response fail type checking. +ResponseClass = t.TypeVar("ResponseClass", bound="Response") + +AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named +AfterRequestCallable = t.Union[ + t.Callable[[ResponseClass], ResponseClass], + t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], +] +BeforeFirstRequestCallable = t.Union[ + t.Callable[[], None], t.Callable[[], t.Awaitable[None]] +] +BeforeRequestCallable = t.Union[ + t.Callable[[], t.Optional[ResponseReturnValue]], + t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], +] +ShellContextProcessorCallable = t.Callable[[], dict[str, t.Any]] +TeardownCallable = t.Union[ + t.Callable[[t.Optional[BaseException]], None], + t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], +] +TemplateContextProcessorCallable = t.Union[ + t.Callable[[], dict[str, t.Any]], + t.Callable[[], t.Awaitable[dict[str, t.Any]]], +] +TemplateFilterCallable = t.Callable[..., t.Any] +TemplateGlobalCallable = t.Callable[..., t.Any] +TemplateTestCallable = t.Callable[..., bool] +URLDefaultCallable = t.Callable[[str, dict[str, t.Any]], None] +URLValuePreprocessorCallable = t.Callable[ + [t.Optional[str], t.Optional[dict[str, t.Any]]], None +] + +# This should take Exception, but that either breaks typing the argument +# with a specific exception, or decorating multiple times with different +# exceptions (and using a union type on the argument). +# https://github.com/pallets/flask/issues/4095 +# https://github.com/pallets/flask/issues/4295 +# https://github.com/pallets/flask/issues/4297 +ErrorHandlerCallable = t.Union[ + t.Callable[[t.Any], ResponseReturnValue], + t.Callable[[t.Any], t.Awaitable[ResponseReturnValue]], +] + +RouteCallable = t.Union[ + t.Callable[..., ResponseReturnValue], + t.Callable[..., t.Awaitable[ResponseReturnValue]], +] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/views.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/views.py new file mode 100644 index 00000000..53fe976d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/views.py @@ -0,0 +1,191 @@ +from __future__ import annotations + +import typing as t + +from . import typing as ft +from .globals import current_app +from .globals import request + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +http_method_funcs = frozenset( + ["get", "post", "head", "options", "delete", "put", "trace", "patch"] +) + + +class View: + """Subclass this class and override :meth:`dispatch_request` to + create a generic class-based view. Call :meth:`as_view` to create a + view function that creates an instance of the class with the given + arguments and calls its ``dispatch_request`` method with any URL + variables. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class Hello(View): + init_every_request = False + + def dispatch_request(self, name): + return f"Hello, {name}!" + + app.add_url_rule( + "/hello/", view_func=Hello.as_view("hello") + ) + + Set :attr:`methods` on the class to change what methods the view + accepts. + + Set :attr:`decorators` on the class to apply a list of decorators to + the generated view function. Decorators applied to the class itself + will not be applied to the generated view function! + + Set :attr:`init_every_request` to ``False`` for efficiency, unless + you need to store request-global data on ``self``. + """ + + #: The methods this view is registered for. Uses the same default + #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and + #: ``add_url_rule`` by default. + methods: t.ClassVar[t.Collection[str] | None] = None + + #: Control whether the ``OPTIONS`` method is handled automatically. + #: Uses the same default (``True``) as ``route`` and + #: ``add_url_rule`` by default. + provide_automatic_options: t.ClassVar[bool | None] = None + + #: A list of decorators to apply, in order, to the generated view + #: function. Remember that ``@decorator`` syntax is applied bottom + #: to top, so the first decorator in the list would be the bottom + #: decorator. + #: + #: .. versionadded:: 0.8 + decorators: t.ClassVar[list[t.Callable[..., t.Any]]] = [] + + #: Create a new instance of this view class for every request by + #: default. If a view subclass sets this to ``False``, the same + #: instance is used for every request. + #: + #: A single instance is more efficient, especially if complex setup + #: is done during init. However, storing data on ``self`` is no + #: longer safe across requests, and :data:`~flask.g` should be used + #: instead. + #: + #: .. versionadded:: 2.2 + init_every_request: t.ClassVar[bool] = True + + def dispatch_request(self) -> ft.ResponseReturnValue: + """The actual view function behavior. Subclasses must override + this and return a valid response. Any variables from the URL + rule are passed as keyword arguments. + """ + raise NotImplementedError() + + @classmethod + def as_view( + cls, name: str, *class_args: t.Any, **class_kwargs: t.Any + ) -> ft.RouteCallable: + """Convert the class into a view function that can be registered + for a route. + + By default, the generated view will create a new instance of the + view class for every request and call its + :meth:`dispatch_request` method. If the view class sets + :attr:`init_every_request` to ``False``, the same instance will + be used for every request. + + Except for ``name``, all other arguments passed to this method + are forwarded to the view class ``__init__`` method. + + .. versionchanged:: 2.2 + Added the ``init_every_request`` class attribute. + """ + if cls.init_every_request: + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + self = view.view_class( # type: ignore[attr-defined] + *class_args, **class_kwargs + ) + return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] + + else: + self = cls(*class_args, **class_kwargs) # pyright: ignore + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] + + if cls.decorators: + view.__name__ = name + view.__module__ = cls.__module__ + for decorator in cls.decorators: + view = decorator(view) + + # We attach the view class to the view function for two reasons: + # first of all it allows us to easily figure out what class-based + # view this thing came from, secondly it's also used for instantiating + # the view class so you can actually replace it with something else + # for testing purposes and debugging. + view.view_class = cls # type: ignore + view.__name__ = name + view.__doc__ = cls.__doc__ + view.__module__ = cls.__module__ + view.methods = cls.methods # type: ignore + view.provide_automatic_options = cls.provide_automatic_options # type: ignore + return view + + +class MethodView(View): + """Dispatches request methods to the corresponding instance methods. + For example, if you implement a ``get`` method, it will be used to + handle ``GET`` requests. + + This can be useful for defining a REST API. + + :attr:`methods` is automatically set based on the methods defined on + the class. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class CounterAPI(MethodView): + def get(self): + return str(session.get("counter", 0)) + + def post(self): + session["counter"] = session.get("counter", 0) + 1 + return redirect(url_for("counter")) + + app.add_url_rule( + "/counter", view_func=CounterAPI.as_view("counter") + ) + """ + + def __init_subclass__(cls, **kwargs: t.Any) -> None: + super().__init_subclass__(**kwargs) + + if "methods" not in cls.__dict__: + methods = set() + + for base in cls.__bases__: + if getattr(base, "methods", None): + methods.update(base.methods) # type: ignore[attr-defined] + + for key in http_method_funcs: + if hasattr(cls, key): + methods.add(key.upper()) + + if methods: + cls.methods = methods + + def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: + meth = getattr(self, request.method.lower(), None) + + # If the request method is HEAD and we don't have a handler for it + # retry with GET. + if meth is None and request.method == "HEAD": + meth = getattr(self, "get", None) + + assert meth is not None, f"Unimplemented method {request.method!r}" + return current_app.ensure_sync(meth)(**kwargs) # type: ignore[no-any-return] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/wrappers.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/wrappers.py new file mode 100644 index 00000000..bab61029 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/wrappers.py @@ -0,0 +1,257 @@ +from __future__ import annotations + +import typing as t + +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import HTTPException +from werkzeug.wrappers import Request as RequestBase +from werkzeug.wrappers import Response as ResponseBase + +from . import json +from .globals import current_app +from .helpers import _split_blueprint_path + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.routing import Rule + + +class Request(RequestBase): + """The request object used by default in Flask. Remembers the + matched endpoint and view arguments. + + It is what ends up as :class:`~flask.request`. If you want to replace + the request object used you can subclass this and set + :attr:`~flask.Flask.request_class` to your subclass. + + The request object is a :class:`~werkzeug.wrappers.Request` subclass and + provides all of the attributes Werkzeug defines plus a few Flask + specific ones. + """ + + json_module: t.Any = json + + #: The internal URL rule that matched the request. This can be + #: useful to inspect which methods are allowed for the URL from + #: a before/after handler (``request.url_rule.methods``) etc. + #: Though if the request's method was invalid for the URL rule, + #: the valid list is available in ``routing_exception.valid_methods`` + #: instead (an attribute of the Werkzeug exception + #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) + #: because the request was never internally bound. + #: + #: .. versionadded:: 0.6 + url_rule: Rule | None = None + + #: A dict of view arguments that matched the request. If an exception + #: happened when matching, this will be ``None``. + view_args: dict[str, t.Any] | None = None + + #: If matching the URL failed, this is the exception that will be + #: raised / was raised as part of the request handling. This is + #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or + #: something similar. + routing_exception: HTTPException | None = None + + _max_content_length: int | None = None + _max_form_memory_size: int | None = None + _max_form_parts: int | None = None + + @property + def max_content_length(self) -> int | None: + """The maximum number of bytes that will be read during this request. If + this limit is exceeded, a 413 :exc:`~werkzeug.exceptions.RequestEntityTooLarge` + error is raised. If it is set to ``None``, no limit is enforced at the + Flask application level. However, if it is ``None`` and the request has + no ``Content-Length`` header and the WSGI server does not indicate that + it terminates the stream, then no data is read to avoid an infinite + stream. + + Each request defaults to the :data:`MAX_CONTENT_LENGTH` config, which + defaults to ``None``. It can be set on a specific ``request`` to apply + the limit to that specific view. This should be set appropriately based + on an application's or view's specific needs. + + .. versionchanged:: 3.1 + This can be set per-request. + + .. versionchanged:: 0.6 + This is configurable through Flask config. + """ + if self._max_content_length is not None: + return self._max_content_length + + if not current_app: + return super().max_content_length + + return current_app.config["MAX_CONTENT_LENGTH"] # type: ignore[no-any-return] + + @max_content_length.setter + def max_content_length(self, value: int | None) -> None: + self._max_content_length = value + + @property + def max_form_memory_size(self) -> int | None: + """The maximum size in bytes any non-file form field may be in a + ``multipart/form-data`` body. If this limit is exceeded, a 413 + :exc:`~werkzeug.exceptions.RequestEntityTooLarge` error is raised. If it + is set to ``None``, no limit is enforced at the Flask application level. + + Each request defaults to the :data:`MAX_FORM_MEMORY_SIZE` config, which + defaults to ``500_000``. It can be set on a specific ``request`` to + apply the limit to that specific view. This should be set appropriately + based on an application's or view's specific needs. + + .. versionchanged:: 3.1 + This is configurable through Flask config. + """ + if self._max_form_memory_size is not None: + return self._max_form_memory_size + + if not current_app: + return super().max_form_memory_size + + return current_app.config["MAX_FORM_MEMORY_SIZE"] # type: ignore[no-any-return] + + @max_form_memory_size.setter + def max_form_memory_size(self, value: int | None) -> None: + self._max_form_memory_size = value + + @property # type: ignore[override] + def max_form_parts(self) -> int | None: + """The maximum number of fields that may be present in a + ``multipart/form-data`` body. If this limit is exceeded, a 413 + :exc:`~werkzeug.exceptions.RequestEntityTooLarge` error is raised. If it + is set to ``None``, no limit is enforced at the Flask application level. + + Each request defaults to the :data:`MAX_FORM_PARTS` config, which + defaults to ``1_000``. It can be set on a specific ``request`` to apply + the limit to that specific view. This should be set appropriately based + on an application's or view's specific needs. + + .. versionchanged:: 3.1 + This is configurable through Flask config. + """ + if self._max_form_parts is not None: + return self._max_form_parts + + if not current_app: + return super().max_form_parts + + return current_app.config["MAX_FORM_PARTS"] # type: ignore[no-any-return] + + @max_form_parts.setter + def max_form_parts(self, value: int | None) -> None: + self._max_form_parts = value + + @property + def endpoint(self) -> str | None: + """The endpoint that matched the request URL. + + This will be ``None`` if matching failed or has not been + performed yet. + + This in combination with :attr:`view_args` can be used to + reconstruct the same URL or a modified URL. + """ + if self.url_rule is not None: + return self.url_rule.endpoint # type: ignore[no-any-return] + + return None + + @property + def blueprint(self) -> str | None: + """The registered name of the current blueprint. + + This will be ``None`` if the endpoint is not part of a + blueprint, or if URL matching failed or has not been performed + yet. + + This does not necessarily match the name the blueprint was + created with. It may have been nested, or registered with a + different name. + """ + endpoint = self.endpoint + + if endpoint is not None and "." in endpoint: + return endpoint.rpartition(".")[0] + + return None + + @property + def blueprints(self) -> list[str]: + """The registered names of the current blueprint upwards through + parent blueprints. + + This will be an empty list if there is no current blueprint, or + if URL matching failed. + + .. versionadded:: 2.0.1 + """ + name = self.blueprint + + if name is None: + return [] + + return _split_blueprint_path(name) + + def _load_form_data(self) -> None: + super()._load_form_data() + + # In debug mode we're replacing the files multidict with an ad-hoc + # subclass that raises a different error for key errors. + if ( + current_app + and current_app.debug + and self.mimetype != "multipart/form-data" + and not self.files + ): + from .debughelpers import attach_enctype_error_multidict + + attach_enctype_error_multidict(self) + + def on_json_loading_failed(self, e: ValueError | None) -> t.Any: + try: + return super().on_json_loading_failed(e) + except BadRequest as ebr: + if current_app and current_app.debug: + raise + + raise BadRequest() from ebr + + +class Response(ResponseBase): + """The response object that is used by default in Flask. Works like the + response object from Werkzeug but is set to have an HTML mimetype by + default. Quite often you don't have to create this object yourself because + :meth:`~flask.Flask.make_response` will take care of that for you. + + If you want to replace the response object used you can subclass this and + set :attr:`~flask.Flask.response_class` to your subclass. + + .. versionchanged:: 1.0 + JSON support is added to the response, like the request. This is useful + when testing to get the test client response data as JSON. + + .. versionchanged:: 1.0 + + Added :attr:`max_cookie_size`. + """ + + default_mimetype: str | None = "text/html" + + json_module = json + + autocorrect_location_header = False + + @property + def max_cookie_size(self) -> int: # type: ignore + """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. + + See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in + Werkzeug's docs. + """ + if current_app: + return current_app.config["MAX_COOKIE_SIZE"] # type: ignore[no-any-return] + + # return Werkzeug's default when not in an app context + return super().max_cookie_size diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__init__.py new file mode 100644 index 00000000..46915c8b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__init__.py @@ -0,0 +1,738 @@ +from __future__ import absolute_import +from functools import wraps, partial +from flask import request, url_for, current_app +from flask import abort as original_flask_abort +from flask import make_response as original_flask_make_response +from flask.views import MethodView +from flask.signals import got_request_exception +from werkzeug.datastructures import Headers +from werkzeug.exceptions import HTTPException, MethodNotAllowed, NotFound, NotAcceptable, InternalServerError +from werkzeug.wrappers import Response as ResponseBase +from flask_restful.utils import http_status_message, unpack, OrderedDict +from flask_restful.representations.json import output_json +import sys +from types import MethodType +import operator +try: + from collections.abc import Mapping +except ImportError: + from collections import Mapping + +_PROPAGATE_EXCEPTIONS = 'PROPAGATE_EXCEPTIONS' + +__all__ = ('Api', 'Resource', 'marshal', 'marshal_with', 'marshal_with_field', 'abort') + + +def abort(http_status_code, **kwargs): + """Raise a HTTPException for the given http_status_code. Attach any keyword + arguments to the exception for later processing. + """ + # noinspection PyUnresolvedReferences + try: + original_flask_abort(http_status_code) + except HTTPException as e: + if len(kwargs): + e.data = kwargs + raise + + +def _get_propagate_exceptions_bool(app): + """Handle Flask's propagate_exceptions. + + If propagate_exceptions is set to True then the exceptions are re-raised rather than being handled + by the app’s error handlers. + + The default value for Flask's app.config['PROPAGATE_EXCEPTIONS'] is None. In this case return a sensible + value: self.testing or self.debug. + """ + propagate_exceptions = app.config.get(_PROPAGATE_EXCEPTIONS, False) + if propagate_exceptions is None: + return app.testing or app.debug + return propagate_exceptions + + +def _handle_flask_propagate_exceptions_config(app, e): + propagate_exceptions = _get_propagate_exceptions_bool(app) + if not isinstance(e, HTTPException) and propagate_exceptions: + exc_type, exc_value, tb = sys.exc_info() + if exc_value is e: + raise + else: + raise e + + +DEFAULT_REPRESENTATIONS = [('application/json', output_json)] + + +class Api(object): + """ + The main entry point for the application. + You need to initialize it with a Flask Application: :: + + >>> app = Flask(__name__) + >>> api = restful.Api(app) + + Alternatively, you can use :meth:`init_app` to set the Flask application + after it has been constructed. + + :param app: the Flask application object + :type app: flask.Flask or flask.Blueprint + :param prefix: Prefix all routes with a value, eg v1 or 2010-04-01 + :type prefix: str + :param default_mediatype: The default media type to return + :type default_mediatype: str + :param decorators: Decorators to attach to every resource + :type decorators: list + :param catch_all_404s: Use :meth:`handle_error` + to handle 404 errors throughout your app + :param serve_challenge_on_401: Whether to serve a challenge response to + clients on receiving 401. This usually leads to a username/password + popup in web browsers. + :param url_part_order: A string that controls the order that the pieces + of the url are concatenated when the full url is constructed. 'b' + is the blueprint (or blueprint registration) prefix, 'a' is the api + prefix, and 'e' is the path component the endpoint is added with + :type catch_all_404s: bool + :param errors: A dictionary to define a custom response for each + exception or error raised during a request + :type errors: dict + + """ + + def __init__(self, app=None, prefix='', + default_mediatype='application/json', decorators=None, + catch_all_404s=False, serve_challenge_on_401=False, + url_part_order='bae', errors=None): + self.representations = OrderedDict(DEFAULT_REPRESENTATIONS) + self.urls = {} + self.prefix = prefix + self.default_mediatype = default_mediatype + self.decorators = decorators if decorators else [] + self.catch_all_404s = catch_all_404s + self.serve_challenge_on_401 = serve_challenge_on_401 + self.url_part_order = url_part_order + self.errors = errors or {} + self.blueprint_setup = None + self.endpoints = set() + self.resources = [] + self.app = None + self.blueprint = None + + if app is not None: + self.app = app + self.init_app(app) + + def init_app(self, app): + """Initialize this class with the given :class:`flask.Flask` + application or :class:`flask.Blueprint` object. + + :param app: the Flask application or blueprint object + :type app: flask.Flask + :type app: flask.Blueprint + + Examples:: + + api = Api() + api.add_resource(...) + api.init_app(app) + + """ + # If app is a blueprint, defer the initialization + try: + app.record(self._deferred_blueprint_init) + # Flask.Blueprint has a 'record' attribute, Flask.Api does not + except AttributeError: + self._init_app(app) + else: + self.blueprint = app + + def _complete_url(self, url_part, registration_prefix): + """This method is used to defer the construction of the final url in + the case that the Api is created with a Blueprint. + + :param url_part: The part of the url the endpoint is registered with + :param registration_prefix: The part of the url contributed by the + blueprint. Generally speaking, BlueprintSetupState.url_prefix + """ + parts = { + 'b': registration_prefix, + 'a': self.prefix, + 'e': url_part + } + return ''.join(parts[key] for key in self.url_part_order if parts[key]) + + @staticmethod + def _blueprint_setup_add_url_rule_patch(blueprint_setup, rule, endpoint=None, view_func=None, **options): + """Method used to patch BlueprintSetupState.add_url_rule for setup + state instance corresponding to this Api instance. Exists primarily + to enable _complete_url's function. + + :param blueprint_setup: The BlueprintSetupState instance (self) + :param rule: A string or callable that takes a string and returns a + string(_complete_url) that is the url rule for the endpoint + being registered + :param endpoint: See BlueprintSetupState.add_url_rule + :param view_func: See BlueprintSetupState.add_url_rule + :param **options: See BlueprintSetupState.add_url_rule + """ + + if callable(rule): + rule = rule(blueprint_setup.url_prefix) + elif blueprint_setup.url_prefix: + rule = blueprint_setup.url_prefix + rule + options.setdefault('subdomain', blueprint_setup.subdomain) + if endpoint is None: + endpoint = view_func.__name__ + defaults = blueprint_setup.url_defaults + if 'defaults' in options: + defaults = dict(defaults, **options.pop('defaults')) + blueprint_setup.app.add_url_rule(rule, '%s.%s' % (blueprint_setup.blueprint.name, endpoint), + view_func, defaults=defaults, **options) + + def _deferred_blueprint_init(self, setup_state): + """Synchronize prefix between blueprint/api and registration options, then + perform initialization with setup_state.app :class:`flask.Flask` object. + When a :class:`flask_restful.Api` object is initialized with a blueprint, + this method is recorded on the blueprint to be run when the blueprint is later + registered to a :class:`flask.Flask` object. This method also monkeypatches + BlueprintSetupState.add_url_rule with _blueprint_setup_add_url_rule_patch. + + :param setup_state: The setup state object passed to deferred functions + during blueprint registration + :type setup_state: flask.blueprints.BlueprintSetupState + + """ + + self.blueprint_setup = setup_state + if setup_state.add_url_rule.__name__ != '_blueprint_setup_add_url_rule_patch': + setup_state._original_add_url_rule = setup_state.add_url_rule + setup_state.add_url_rule = MethodType(Api._blueprint_setup_add_url_rule_patch, + setup_state) + if not setup_state.first_registration: + raise ValueError('flask-restful blueprints can only be registered once.') + self._init_app(setup_state.app) + + def _init_app(self, app): + """Perform initialization actions with the given :class:`flask.Flask` + object. + + :param app: The flask application object + :type app: flask.Flask + """ + app.handle_exception = partial(self.error_router, app.handle_exception) + app.handle_user_exception = partial(self.error_router, app.handle_user_exception) + + if len(self.resources) > 0: + for resource, urls, kwargs in self.resources: + self._register_view(app, resource, *urls, **kwargs) + + def owns_endpoint(self, endpoint): + """Tests if an endpoint name (not path) belongs to this Api. Takes + in to account the Blueprint name part of the endpoint name. + + :param endpoint: The name of the endpoint being checked + :return: bool + """ + + if self.blueprint: + if endpoint.startswith(self.blueprint.name): + endpoint = endpoint.split(self.blueprint.name + '.', 1)[-1] + else: + return False + return endpoint in self.endpoints + + def _should_use_fr_error_handler(self): + """ Determine if error should be handled with FR or default Flask + + The goal is to return Flask error handlers for non-FR-related routes, + and FR errors (with the correct media type) for FR endpoints. This + method currently handles 404 and 405 errors. + + :return: bool + """ + adapter = current_app.create_url_adapter(request) + + try: + adapter.match() + except MethodNotAllowed as e: + # Check if the other HTTP methods at this url would hit the Api + valid_route_method = e.valid_methods[0] + rule, _ = adapter.match(method=valid_route_method, return_rule=True) + return self.owns_endpoint(rule.endpoint) + except NotFound: + return self.catch_all_404s + except: + # Werkzeug throws other kinds of exceptions, such as Redirect + pass + + def _has_fr_route(self): + """Encapsulating the rules for whether the request was to a Flask endpoint""" + # 404's, 405's, which might not have a url_rule + if self._should_use_fr_error_handler(): + return True + # for all other errors, just check if FR dispatched the route + if not request.url_rule: + return False + return self.owns_endpoint(request.url_rule.endpoint) + + def error_router(self, original_handler, e): + """This function decides whether the error occured in a flask-restful + endpoint or not. If it happened in a flask-restful endpoint, our + handler will be dispatched. If it happened in an unrelated view, the + app's original error handler will be dispatched. + In the event that the error occurred in a flask-restful endpoint but + the local handler can't resolve the situation, the router will fall + back onto the original_handler as last resort. + + :param original_handler: the original Flask error handler for the app + :type original_handler: function + :param e: the exception raised while handling the request + :type e: Exception + + """ + if self._has_fr_route(): + try: + return self.handle_error(e) + except Exception: + pass # Fall through to original handler + return original_handler(e) + + def handle_error(self, e): + """Error handler for the API transforms a raised exception into a Flask + response, with the appropriate HTTP status code and body. + + :param e: the raised Exception object + :type e: Exception + + """ + got_request_exception.send(current_app._get_current_object(), exception=e) + + _handle_flask_propagate_exceptions_config(current_app, e) + + headers = Headers() + if isinstance(e, HTTPException): + if e.response is not None: + # If HTTPException is initialized with a response, then return e.get_response(). + # This prevents specified error response from being overridden. + # e.g., HTTPException(response=Response("Hello World")) + resp = e.get_response() + return resp + + code = e.code + default_data = { + 'message': getattr(e, 'description', http_status_message(code)) + } + headers = e.get_response().headers + else: + code = 500 + default_data = { + 'message': http_status_message(code), + } + + # Werkzeug exceptions generate a content-length header which is added + # to the response in addition to the actual content-length header + # https://github.com/flask-restful/flask-restful/issues/534 + remove_headers = ('Content-Length',) + + for header in remove_headers: + headers.pop(header, None) + + data = getattr(e, 'data', default_data) + + if code and code >= 500: + exc_info = sys.exc_info() + if exc_info[1] is None: + exc_info = None + current_app.log_exception(exc_info) + + error_cls_name = type(e).__name__ + if error_cls_name in self.errors: + custom_data = self.errors.get(error_cls_name, {}) + code = custom_data.get('status', 500) + data.update(custom_data) + + if code == 406 and self.default_mediatype is None: + # if we are handling NotAcceptable (406), make sure that + # make_response uses a representation we support as the + # default mediatype (so that make_response doesn't throw + # another NotAcceptable error). + supported_mediatypes = list(self.representations.keys()) + fallback_mediatype = supported_mediatypes[0] if supported_mediatypes else "text/plain" + resp = self.make_response( + data, + code, + headers, + fallback_mediatype = fallback_mediatype + ) + else: + resp = self.make_response(data, code, headers) + + if code == 401: + resp = self.unauthorized(resp) + return resp + + def mediatypes_method(self): + """Return a method that returns a list of mediatypes + """ + return lambda resource_cls: self.mediatypes() + [self.default_mediatype] + + def add_resource(self, resource, *urls, **kwargs): + """Adds a resource to the api. + + :param resource: the class name of your resource + :type resource: :class:`Type[Resource]` + + :param urls: one or more url routes to match for the resource, standard + flask routing rules apply. Any url variables will be + passed to the resource method as args. + :type urls: str + + :param endpoint: endpoint name (defaults to :meth:`Resource.__name__.lower` + Can be used to reference this route in :class:`fields.Url` fields + :type endpoint: str + + :param resource_class_args: args to be forwarded to the constructor of + the resource. + :type resource_class_args: tuple + + :param resource_class_kwargs: kwargs to be forwarded to the constructor + of the resource. + :type resource_class_kwargs: dict + + Additional keyword arguments not specified above will be passed as-is + to :meth:`flask.Flask.add_url_rule`. + + Examples:: + + api.add_resource(HelloWorld, '/', '/hello') + api.add_resource(Foo, '/foo', endpoint="foo") + api.add_resource(FooSpecial, '/special/foo', endpoint="foo") + + """ + if self.app is not None: + self._register_view(self.app, resource, *urls, **kwargs) + else: + self.resources.append((resource, urls, kwargs)) + + def resource(self, *urls, **kwargs): + """Wraps a :class:`~flask_restful.Resource` class, adding it to the + api. Parameters are the same as :meth:`~flask_restful.Api.add_resource`. + + Example:: + + app = Flask(__name__) + api = restful.Api(app) + + @api.resource('/foo') + class Foo(Resource): + def get(self): + return 'Hello, World!' + + """ + def decorator(cls): + self.add_resource(cls, *urls, **kwargs) + return cls + return decorator + + def _register_view(self, app, resource, *urls, **kwargs): + endpoint = kwargs.pop('endpoint', None) or resource.__name__.lower() + self.endpoints.add(endpoint) + resource_class_args = kwargs.pop('resource_class_args', ()) + resource_class_kwargs = kwargs.pop('resource_class_kwargs', {}) + + # NOTE: 'view_functions' is cleaned up from Blueprint class in Flask 1.0 + if endpoint in getattr(app, 'view_functions', {}): + previous_view_class = app.view_functions[endpoint].__dict__['view_class'] + + # if you override the endpoint with a different class, avoid the collision by raising an exception + if previous_view_class != resource: + raise ValueError('This endpoint (%s) is already set to the class %s.' % (endpoint, previous_view_class.__name__)) + + resource.mediatypes = self.mediatypes_method() # Hacky + resource.endpoint = endpoint + resource_func = self.output(resource.as_view(endpoint, *resource_class_args, + **resource_class_kwargs)) + + for decorator in self.decorators: + resource_func = decorator(resource_func) + + for url in urls: + # If this Api has a blueprint + if self.blueprint: + # And this Api has been setup + if self.blueprint_setup: + # Set the rule to a string directly, as the blueprint is already + # set up. + self.blueprint_setup.add_url_rule(url, view_func=resource_func, **kwargs) + continue + else: + # Set the rule to a function that expects the blueprint prefix + # to construct the final url. Allows deferment of url finalization + # in the case that the associated Blueprint has not yet been + # registered to an application, so we can wait for the registration + # prefix + rule = partial(self._complete_url, url) + else: + # If we've got no Blueprint, just build a url with no prefix + rule = self._complete_url(url, '') + # Add the url to the application or blueprint + app.add_url_rule(rule, view_func=resource_func, **kwargs) + + def output(self, resource): + """Wraps a resource (as a flask view function), for cases where the + resource does not directly return a response object + + :param resource: The resource as a flask view function + """ + @wraps(resource) + def wrapper(*args, **kwargs): + resp = resource(*args, **kwargs) + if isinstance(resp, ResponseBase): # There may be a better way to test + return resp + data, code, headers = unpack(resp) + return self.make_response(data, code, headers=headers) + return wrapper + + def url_for(self, resource, **values): + """Generates a URL to the given resource. + + Works like :func:`flask.url_for`.""" + endpoint = resource.endpoint + if self.blueprint: + endpoint = '{0}.{1}'.format(self.blueprint.name, endpoint) + return url_for(endpoint, **values) + + def make_response(self, data, *args, **kwargs): + """Looks up the representation transformer for the requested media + type, invoking the transformer to create a response object. This + defaults to default_mediatype if no transformer is found for the + requested mediatype. If default_mediatype is None, a 406 Not + Acceptable response will be sent as per RFC 2616 section 14.1 + + :param data: Python object containing response data to be transformed + """ + default_mediatype = kwargs.pop('fallback_mediatype', None) or self.default_mediatype + mediatype = request.accept_mimetypes.best_match( + self.representations, + default=default_mediatype, + ) + if mediatype is None: + raise NotAcceptable() + if mediatype in self.representations: + resp = self.representations[mediatype](data, *args, **kwargs) + resp.headers['Content-Type'] = mediatype + return resp + elif mediatype == 'text/plain': + resp = original_flask_make_response(str(data), *args, **kwargs) + resp.headers['Content-Type'] = 'text/plain' + return resp + else: + raise InternalServerError() + + def mediatypes(self): + """Returns a list of requested mediatypes sent in the Accept header""" + return [h for h, q in sorted(request.accept_mimetypes, + key=operator.itemgetter(1), reverse=True)] + + def representation(self, mediatype): + """Allows additional representation transformers to be declared for the + api. Transformers are functions that must be decorated with this + method, passing the mediatype the transformer represents. Three + arguments are passed to the transformer: + + * The data to be represented in the response body + * The http status code + * A dictionary of headers + + The transformer should convert the data appropriately for the mediatype + and return a Flask response object. + + Ex:: + + @api.representation('application/xml') + def xml(data, code, headers): + resp = make_response(convert_data_to_xml(data), code) + resp.headers.extend(headers) + return resp + """ + def wrapper(func): + self.representations[mediatype] = func + return func + return wrapper + + def unauthorized(self, response): + """ Given a response, change it to ask for credentials """ + + if self.serve_challenge_on_401: + realm = current_app.config.get("HTTP_BASIC_AUTH_REALM", "flask-restful") + challenge = u"{0} realm=\"{1}\"".format("Basic", realm) + + response.headers['WWW-Authenticate'] = challenge + return response + + +class Resource(MethodView): + """ + Represents an abstract RESTful resource. Concrete resources should + extend from this class and expose methods for each supported HTTP + method. If a resource is invoked with an unsupported HTTP method, + the API will return a response with status 405 Method Not Allowed. + Otherwise the appropriate method is called and passed all arguments + from the url rule used when adding the resource to an Api instance. See + :meth:`~flask_restful.Api.add_resource` for details. + """ + representations = None + method_decorators = [] + + def dispatch_request(self, *args, **kwargs): + + # Taken from flask + #noinspection PyUnresolvedReferences + meth = getattr(self, request.method.lower(), None) + if meth is None and request.method == 'HEAD': + meth = getattr(self, 'get', None) + assert meth is not None, 'Unimplemented method %r' % request.method + + if isinstance(self.method_decorators, Mapping): + decorators = self.method_decorators.get(request.method.lower(), []) + else: + decorators = self.method_decorators + + for decorator in decorators: + meth = decorator(meth) + + resp = meth(*args, **kwargs) + + if isinstance(resp, ResponseBase): # There may be a better way to test + return resp + + representations = self.representations or OrderedDict() + + #noinspection PyUnresolvedReferences + mediatype = request.accept_mimetypes.best_match(representations, default=None) + if mediatype in representations: + data, code, headers = unpack(resp) + resp = representations[mediatype](data, code, headers) + resp.headers['Content-Type'] = mediatype + return resp + + return resp + + +def marshal(data, fields, envelope=None): + """Takes raw data (in the form of a dict, list, object) and a dict of + fields to output and filters the data based on those fields. + + :param data: the actual object(s) from which the fields are taken from + :param fields: a dict of whose keys will make up the final serialized + response output + :param envelope: optional key that will be used to envelop the serialized + response + + + >>> from flask_restful import fields, marshal + >>> data = { 'a': 100, 'b': 'foo' } + >>> mfields = { 'a': fields.Raw } + + >>> marshal(data, mfields) + OrderedDict([('a', 100)]) + + >>> marshal(data, mfields, envelope='data') + OrderedDict([('data', OrderedDict([('a', 100)]))]) + + """ + + def make(cls): + if isinstance(cls, type): + return cls() + return cls + + if isinstance(data, (list, tuple)): + return (OrderedDict([(envelope, [marshal(d, fields) for d in data])]) + if envelope else [marshal(d, fields) for d in data]) + + items = ((k, marshal(data, v) if isinstance(v, dict) + else make(v).output(k, data)) + for k, v in fields.items()) + return OrderedDict([(envelope, OrderedDict(items))]) if envelope else OrderedDict(items) + + +class marshal_with(object): + """A decorator that apply marshalling to the return values of your methods. + + >>> from flask_restful import fields, marshal_with + >>> mfields = { 'a': fields.Raw } + >>> @marshal_with(mfields) + ... def get(): + ... return { 'a': 100, 'b': 'foo' } + ... + ... + >>> get() + OrderedDict([('a', 100)]) + + >>> @marshal_with(mfields, envelope='data') + ... def get(): + ... return { 'a': 100, 'b': 'foo' } + ... + ... + >>> get() + OrderedDict([('data', OrderedDict([('a', 100)]))]) + + see :meth:`flask_restful.marshal` + """ + def __init__(self, fields, envelope=None): + """ + :param fields: a dict of whose keys will make up the final + serialized response output + :param envelope: optional key that will be used to envelop the serialized + response + """ + self.fields = fields + self.envelope = envelope + + def __call__(self, f): + @wraps(f) + def wrapper(*args, **kwargs): + resp = f(*args, **kwargs) + if isinstance(resp, tuple): + data, code, headers = unpack(resp) + return marshal(data, self.fields, self.envelope), code, headers + else: + return marshal(resp, self.fields, self.envelope) + return wrapper + + +class marshal_with_field(object): + """ + A decorator that formats the return values of your methods with a single field. + + >>> from flask_restful import marshal_with_field, fields + >>> @marshal_with_field(fields.List(fields.Integer)) + ... def get(): + ... return ['1', 2, 3.0] + ... + >>> get() + [1, 2, 3] + + see :meth:`flask_restful.marshal_with` + """ + def __init__(self, field): + """ + :param field: a single field with which to marshal the output. + """ + if isinstance(field, type): + self.field = field() + else: + self.field = field + + def __call__(self, f): + @wraps(f) + def wrapper(*args, **kwargs): + resp = f(*args, **kwargs) + + if isinstance(resp, tuple): + data, code, headers = unpack(resp) + return self.field.format(data), code, headers + return self.field.format(resp) + + return wrapper diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dc1e2eedab515f25c7e27841623fd81341150f0 GIT binary patch literal 32979 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/__version__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d11f6fd63d6e031d68423ca03e57570ceac8d6d9 GIT binary patch literal 229 zcmX@j%ge<81U|+u)AfM#V-N=h7@>^M96-i&h7^VKB$~R^=uZ zm!uZym!;;F>E~o7=@(R%WaQ@o4K>m)&MZmQEl5nxPE1cN)=$exEY6NEN-Zu)E6veI tvP`d_@)w6qZhlH>PO4oI8_-^mYm0e+#0O?ZM#c|p4E*Aa+(j%v0RVUJKWP8} literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/fields.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/fields.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf17c8c2e5d5e13627381bac8c5bb6aee40d149c GIT binary patch literal 18555 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

8pDh5B52ns7<$GU(+5IZhL5rS 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/reqparse.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__pycache__/reqparse.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71a522519485fae418415338de26fc1fdbc99898 GIT binary patch literal 18032 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__version__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__version__.py new file mode 100644 index 00000000..926e118e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/__version__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python + +__version__ = '0.3.10' diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/fields.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/fields.py new file mode 100644 index 00000000..70a54060 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/fields.py @@ -0,0 +1,414 @@ +from calendar import timegm +from decimal import Decimal as MyDecimal, ROUND_HALF_EVEN +from email.utils import formatdate +import six +try: + from urlparse import urlparse, urlunparse +except ImportError: + # python3 + from urllib.parse import urlparse, urlunparse +from flask_restful import marshal +from flask import url_for, request + +__all__ = ["String", "FormattedString", "Url", "DateTime", "Float", + "Integer", "Arbitrary", "Nested", "List", "Raw", "Boolean", + "Fixed", "Price"] + + +class MarshallingException(Exception): + """ + This is an encapsulating Exception in case of marshalling error. + """ + + def __init__(self, underlying_exception): + # just put the contextual representation of the error to hint on what + # went wrong without exposing internals + super(MarshallingException, self).__init__(six.text_type(underlying_exception)) + + +def is_indexable_but_not_string(obj): + return not hasattr(obj, "strip") and hasattr(obj, "__iter__") + + +def get_value(key, obj, default=None): + """Helper for pulling a keyed value off various types of objects""" + if isinstance(key, int): + return _get_value_for_key(key, obj, default) + elif callable(key): + return key(obj) + else: + return _get_value_for_keys(key.split('.'), obj, default) + + +def _get_value_for_keys(keys, obj, default): + if len(keys) == 1: + return _get_value_for_key(keys[0], obj, default) + else: + return _get_value_for_keys( + keys[1:], _get_value_for_key(keys[0], obj, default), default) + + +def _get_value_for_key(key, obj, default): + if is_indexable_but_not_string(obj): + try: + return obj[key] + except (IndexError, TypeError, KeyError): + pass + return getattr(obj, key, default) + + +def to_marshallable_type(obj): + """Helper for converting an object to a dictionary only if it is not + dictionary already or an indexable object nor a simple type""" + if obj is None: + return None # make it idempotent for None + + if hasattr(obj, '__marshallable__'): + return obj.__marshallable__() + + if hasattr(obj, '__getitem__'): + return obj # it is indexable it is ok + + return dict(obj.__dict__) + + +class Raw(object): + """Raw provides a base field class from which others should extend. It + applies no formatting by default, and should only be used in cases where + data does not need to be formatted before being serialized. Fields should + throw a :class:`MarshallingException` in case of parsing problem. + + :param default: The default value for the field, if no value is + specified. + :param attribute: If the public facing value differs from the internal + value, use this to retrieve a different attribute from the response + than the publicly named value. + """ + + def __init__(self, default=None, attribute=None): + self.attribute = attribute + self.default = default + + def format(self, value): + """Formats a field's value. No-op by default - field classes that + modify how the value of existing object keys should be presented should + override this and apply the appropriate formatting. + + :param value: The value to format + :exception MarshallingException: In case of formatting problem + + Ex:: + + class TitleCase(Raw): + def format(self, value): + return unicode(value).title() + """ + return value + + def output(self, key, obj): + """Pulls the value for the given key from the object, applies the + field's formatting and returns the result. If the key is not found + in the object, returns the default value. Field classes that create + values which do not require the existence of the key in the object + should override this and return the desired value. + + :exception MarshallingException: In case of formatting problem + """ + + value = get_value(key if self.attribute is None else self.attribute, obj) + + if value is None: + return self.default + + return self.format(value) + + +class Nested(Raw): + """Allows you to nest one set of fields inside another. + See :ref:`nested-field` for more information + + :param dict nested: The dictionary to nest + :param bool allow_null: Whether to return None instead of a dictionary + with null keys, if a nested dictionary has all-null keys + :param kwargs: If ``default`` keyword argument is present, a nested + dictionary will be marshaled as its value if nested dictionary is + all-null keys (e.g. lets you return an empty JSON object instead of + null) + """ + + def __init__(self, nested, allow_null=False, **kwargs): + self.nested = nested + self.allow_null = allow_null + super(Nested, self).__init__(**kwargs) + + def output(self, key, obj): + value = get_value(key if self.attribute is None else self.attribute, obj) + if value is None: + if self.allow_null: + return None + elif self.default is not None: + return self.default + + return marshal(value, self.nested) + + +class List(Raw): + """ + Field for marshalling lists of other fields. + + See :ref:`list-field` for more information. + + :param cls_or_instance: The field type the list will contain. + """ + + def __init__(self, cls_or_instance, **kwargs): + super(List, self).__init__(**kwargs) + error_msg = ("The type of the list elements must be a subclass of " + "flask_restful.fields.Raw") + if isinstance(cls_or_instance, type): + if not issubclass(cls_or_instance, Raw): + raise MarshallingException(error_msg) + self.container = cls_or_instance() + else: + if not isinstance(cls_or_instance, Raw): + raise MarshallingException(error_msg) + self.container = cls_or_instance + + def format(self, value): + # Convert all instances in typed list to container type + if isinstance(value, set): + value = list(value) + + return [ + self.container.output(idx, + val if (isinstance(val, dict) + or (self.container.attribute + and hasattr(val, self.container.attribute))) + and not isinstance(self.container, Nested) + and not type(self.container) is Raw + else value) + for idx, val in enumerate(value) + ] + + def output(self, key, data): + value = get_value(key if self.attribute is None else self.attribute, data) + # we cannot really test for external dict behavior + if is_indexable_but_not_string(value) and not isinstance(value, dict): + return self.format(value) + + if value is None: + return self.default + + return [marshal(value, self.container.nested)] + + +class String(Raw): + """ + Marshal a value as a string. Uses ``six.text_type`` so values will + be converted to :class:`unicode` in python2 and :class:`str` in + python3. + """ + def format(self, value): + try: + return six.text_type(value) + except ValueError as ve: + raise MarshallingException(ve) + + +class Integer(Raw): + """ Field for outputting an integer value. + + :param int default: The default value for the field, if no value is + specified. + """ + def __init__(self, default=0, **kwargs): + super(Integer, self).__init__(default=default, **kwargs) + + def format(self, value): + try: + if value is None: + return self.default + return int(value) + except ValueError as ve: + raise MarshallingException(ve) + + +class Boolean(Raw): + """ + Field for outputting a boolean value. + + Empty collections such as ``""``, ``{}``, ``[]``, etc. will be converted to + ``False``. + """ + def format(self, value): + return bool(value) + + +class FormattedString(Raw): + """ + FormattedString is used to interpolate other values from + the response into this field. The syntax for the source string is + the same as the string :meth:`~str.format` method from the python + stdlib. + + Ex:: + + fields = { + 'name': fields.String, + 'greeting': fields.FormattedString("Hello {name}") + } + data = { + 'name': 'Doug', + } + marshal(data, fields) + """ + def __init__(self, src_str): + """ + :param string src_str: the string to format with the other + values from the response. + """ + super(FormattedString, self).__init__() + self.src_str = six.text_type(src_str) + + def output(self, key, obj): + try: + data = to_marshallable_type(obj) + return self.src_str.format(**data) + except (TypeError, IndexError) as error: + raise MarshallingException(error) + + +class Url(Raw): + """ + A string representation of a Url + + :param endpoint: Endpoint name. If endpoint is ``None``, + ``request.endpoint`` is used instead + :type endpoint: str + :param absolute: If ``True``, ensures that the generated urls will have the + hostname included + :type absolute: bool + :param scheme: URL scheme specifier (e.g. ``http``, ``https``) + :type scheme: str + """ + def __init__(self, endpoint=None, absolute=False, scheme=None, **kwargs): + super(Url, self).__init__(**kwargs) + self.endpoint = endpoint + self.absolute = absolute + self.scheme = scheme + + def output(self, key, obj): + try: + data = to_marshallable_type(obj) + endpoint = self.endpoint if self.endpoint is not None else request.endpoint + o = urlparse(url_for(endpoint, _external=self.absolute, **data)) + if self.absolute: + scheme = self.scheme if self.scheme is not None else o.scheme + return urlunparse((scheme, o.netloc, o.path, "", "", "")) + return urlunparse(("", "", o.path, "", "", "")) + except TypeError as te: + raise MarshallingException(te) + + +class Float(Raw): + """ + A double as IEEE-754 double precision. + ex : 3.141592653589793 3.1415926535897933e-06 3.141592653589793e+24 nan inf + -inf + """ + + def format(self, value): + try: + return float(value) + except ValueError as ve: + raise MarshallingException(ve) + + +class Arbitrary(Raw): + """ + A floating point number with an arbitrary precision + ex: 634271127864378216478362784632784678324.23432 + """ + + def format(self, value): + return six.text_type(MyDecimal(value)) + + +class DateTime(Raw): + """ + Return a formatted datetime string in UTC. Supported formats are RFC 822 + and ISO 8601. + + See :func:`email.utils.formatdate` for more info on the RFC 822 format. + + See :meth:`datetime.datetime.isoformat` for more info on the ISO 8601 + format. + + :param dt_format: ``'rfc822'`` or ``'iso8601'`` + :type dt_format: str + """ + def __init__(self, dt_format='rfc822', **kwargs): + super(DateTime, self).__init__(**kwargs) + self.dt_format = dt_format + + def format(self, value): + try: + if self.dt_format == 'rfc822': + return _rfc822(value) + elif self.dt_format == 'iso8601': + return _iso8601(value) + else: + raise MarshallingException( + 'Unsupported date format %s' % self.dt_format + ) + except AttributeError as ae: + raise MarshallingException(ae) + +ZERO = MyDecimal() + + +class Fixed(Raw): + """ + A decimal number with a fixed precision. + """ + def __init__(self, decimals=5, **kwargs): + super(Fixed, self).__init__(**kwargs) + self.precision = MyDecimal('0.' + '0' * (decimals - 1) + '1') + + def format(self, value): + dvalue = MyDecimal(value) + if not dvalue.is_normal() and dvalue != ZERO: + raise MarshallingException('Invalid Fixed precision number.') + return six.text_type(dvalue.quantize(self.precision, rounding=ROUND_HALF_EVEN)) + + +"""Alias for :class:`~fields.Fixed`""" +Price = Fixed + + +def _rfc822(dt): + """Turn a datetime object into a formatted date. + + Example:: + + fields._rfc822(datetime(2011, 1, 1)) => "Sat, 01 Jan 2011 00:00:00 -0000" + + :param dt: The datetime to transform + :type dt: datetime + :return: A RFC 822 formatted date string + """ + return formatdate(timegm(dt.utctimetuple())) + + +def _iso8601(dt): + """Turn a datetime object into an ISO8601 formatted date. + + Example:: + + fields._iso8601(datetime(2012, 1, 1, 0, 0)) => "2012-01-01T00:00:00" + + :param dt: The datetime to transform + :type dt: datetime + :return: A ISO 8601 formatted date string + """ + return dt.isoformat() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/inputs.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/inputs.py new file mode 100644 index 00000000..1b36c85e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/inputs.py @@ -0,0 +1,282 @@ +from calendar import timegm +from datetime import datetime, time, timedelta +from email.utils import parsedate_tz, mktime_tz +import re + +import aniso8601 +import pytz + +# Constants for upgrading date-based intervals to full datetimes. +START_OF_DAY = time(0, 0, 0, tzinfo=pytz.UTC) +END_OF_DAY = time(23, 59, 59, 999999, tzinfo=pytz.UTC) + +# https://code.djangoproject.com/browser/django/trunk/django/core/validators.py +# basic auth added by frank + +url_regex = re.compile( + r'^(?:http|ftp)s?://' # http:// or https:// + r'(?:[^:@]+?:[^:@]*?@|)' # basic auth + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+' + r'(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... + r'localhost|' # localhost... + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|' # ...or ipv4 + r'\[?[A-F0-9]*:[A-F0-9:]+\]?)' # ...or ipv6 + r'(?::\d+)?' # optional port + r'(?:/?|[/?]\S+)$', re.IGNORECASE) + + +def url(value): + """Validate a URL. + + :param string value: The URL to validate + :returns: The URL if valid. + :raises: ValueError + """ + if not url_regex.search(value): + message = u"{0} is not a valid URL".format(value) + if url_regex.search('http://' + value): + message += u". Did you mean: http://{0}".format(value) + raise ValueError(message) + return value + + +class regex(object): + """Validate a string based on a regular expression. + + Example:: + + parser = reqparse.RequestParser() + parser.add_argument('example', type=inputs.regex('^[0-9]+$')) + + Input to the ``example`` argument will be rejected if it contains anything + but numbers. + + :param pattern: The regular expression the input must match + :type pattern: str + :param flags: Flags to change expression behavior + :type flags: int + """ + + def __init__(self, pattern, flags=0): + self.pattern = pattern + self.re = re.compile(pattern, flags) + + def __call__(self, value): + if not self.re.search(value): + message = 'Value does not match pattern: "{0}"'.format(self.pattern) + raise ValueError(message) + return value + + def __deepcopy__(self, memo): + return regex(self.pattern) + + +def _normalize_interval(start, end, value): + """Normalize datetime intervals. + + Given a pair of datetime.date or datetime.datetime objects, + returns a 2-tuple of tz-aware UTC datetimes spanning the same interval. + + For datetime.date objects, the returned interval starts at 00:00:00.0 + on the first date and ends at 00:00:00.0 on the second. + + Naive datetimes are upgraded to UTC. + + Timezone-aware datetimes are normalized to the UTC tzdata. + + Params: + - start: A date or datetime + - end: A date or datetime + """ + if not isinstance(start, datetime): + start = datetime.combine(start, START_OF_DAY) + end = datetime.combine(end, START_OF_DAY) + + if start.tzinfo is None: + start = pytz.UTC.localize(start) + end = pytz.UTC.localize(end) + else: + start = start.astimezone(pytz.UTC) + end = end.astimezone(pytz.UTC) + + return start, end + + +def _expand_datetime(start, value): + if not isinstance(start, datetime): + # Expand a single date object to be the interval spanning + # that entire day. + end = start + timedelta(days=1) + else: + # Expand a datetime based on the finest resolution provided + # in the original input string. + time = value.split('T')[1] + time_without_offset = re.sub('[+-].+', '', time) + num_separators = time_without_offset.count(':') + if num_separators == 0: + # Hour resolution + end = start + timedelta(hours=1) + elif num_separators == 1: + # Minute resolution: + end = start + timedelta(minutes=1) + else: + # Second resolution + end = start + timedelta(seconds=1) + + return end + + +def _parse_interval(value): + """Do some nasty try/except voodoo to get some sort of datetime + object(s) out of the string. + """ + try: + return sorted(aniso8601.parse_interval(value)) + except ValueError: + try: + return aniso8601.parse_datetime(value), None + except ValueError: + return aniso8601.parse_date(value), None + + +def iso8601interval(value, argument='argument'): + """Parses ISO 8601-formatted datetime intervals into tuples of datetimes. + + Accepts both a single date(time) or a full interval using either start/end + or start/duration notation, with the following behavior: + + - Intervals are defined as inclusive start, exclusive end + - Single datetimes are translated into the interval spanning the + largest resolution not specified in the input value, up to the day. + - The smallest accepted resolution is 1 second. + - All timezones are accepted as values; returned datetimes are + localized to UTC. Naive inputs and date inputs will are assumed UTC. + + Examples:: + + "2013-01-01" -> datetime(2013, 1, 1), datetime(2013, 1, 2) + "2013-01-01T12" -> datetime(2013, 1, 1, 12), datetime(2013, 1, 1, 13) + "2013-01-01/2013-02-28" -> datetime(2013, 1, 1), datetime(2013, 2, 28) + "2013-01-01/P3D" -> datetime(2013, 1, 1), datetime(2013, 1, 4) + "2013-01-01T12:00/PT30M" -> datetime(2013, 1, 1, 12), datetime(2013, 1, 1, 12, 30) + "2013-01-01T06:00/2013-01-01T12:00" -> datetime(2013, 1, 1, 6), datetime(2013, 1, 1, 12) + + :param str value: The ISO8601 date time as a string + :return: Two UTC datetimes, the start and the end of the specified interval + :rtype: A tuple (datetime, datetime) + :raises: ValueError, if the interval is invalid. + """ + + try: + start, end = _parse_interval(value) + + if end is None: + end = _expand_datetime(start, value) + + start, end = _normalize_interval(start, end, value) + + except ValueError: + raise ValueError( + "Invalid {arg}: {value}. {arg} must be a valid ISO8601 " + "date/time interval.".format(arg=argument, value=value), + ) + + return start, end + + +def date(value): + """Parse a valid looking date in the format YYYY-mm-dd""" + date = datetime.strptime(value, "%Y-%m-%d") + return date + + +def _get_integer(value): + try: + return int(value) + except (TypeError, ValueError): + raise ValueError('{0} is not a valid integer'.format(value)) + + +def natural(value, argument='argument'): + """ Restrict input type to the natural numbers (0, 1, 2, 3...) """ + value = _get_integer(value) + if value < 0: + error = ('Invalid {arg}: {value}. {arg} must be a non-negative ' + 'integer'.format(arg=argument, value=value)) + raise ValueError(error) + return value + + +def positive(value, argument='argument'): + """ Restrict input type to the positive integers (1, 2, 3...) """ + value = _get_integer(value) + if value < 1: + error = ('Invalid {arg}: {value}. {arg} must be a positive ' + 'integer'.format(arg=argument, value=value)) + raise ValueError(error) + return value + + +class int_range(object): + """ Restrict input to an integer in a range (inclusive) """ + def __init__(self, low, high, argument='argument'): + self.low = low + self.high = high + self.argument = argument + + def __call__(self, value): + value = _get_integer(value) + if value < self.low or value > self.high: + error = ('Invalid {arg}: {val}. {arg} must be within the range {lo} - {hi}' + .format(arg=self.argument, val=value, lo=self.low, hi=self.high)) + raise ValueError(error) + + return value + + +def boolean(value): + """Parse the string ``"true"`` or ``"false"`` as a boolean (case + insensitive). Also accepts ``"1"`` and ``"0"`` as ``True``/``False`` + (respectively). If the input is from the request JSON body, the type is + already a native python boolean, and will be passed through without + further parsing. + """ + if isinstance(value, bool): + return value + + if not value: + raise ValueError("boolean type must be non-null") + value = value.lower() + if value in ('true', '1',): + return True + if value in ('false', '0',): + return False + raise ValueError("Invalid literal for boolean(): {0}".format(value)) + + +def datetime_from_rfc822(datetime_str): + """Turns an RFC822 formatted date into a datetime object. + + Example:: + + inputs.datetime_from_rfc822("Wed, 02 Oct 2002 08:00:00 EST") + + :param datetime_str: The RFC822-complying string to transform + :type datetime_str: str + :return: A datetime + """ + return datetime.fromtimestamp(mktime_tz(parsedate_tz(datetime_str)), pytz.utc) + + +def datetime_from_iso8601(datetime_str): + """Turns an ISO8601 formatted datetime into a datetime object. + + Example:: + + inputs.datetime_from_iso8601("2012-01-01T23:30:00+02:00") + + :param datetime_str: The ISO8601-complying string to transform + :type datetime_str: str + :return: A datetime + """ + return aniso8601.parse_datetime(datetime_str) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__init__.py @@ -0,0 +1 @@ + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24aa809d1df543e32e2568d180281bc3074aabdf GIT binary patch literal 213 zcmZ9Gu?oU47=#n6AVMF+L4VX$1i_`CPCAFEzin)q#{8*JU&LqdS$qs9M{#p9UA^VL zJ8rl~9QRnza`H-f@MjbL^=XIZ#%k8*>pOF;kUq`k>tRdi2r!q1vXe3gsUb-=D_G4J zBRE&;T1fKf;DY7?TJ6BrJ}b>+I2r>fj{__BxlEDZs3qmXA^Bsa!J!R^#!IhCLm-4Q e$_p{H^|w1M%0s1b<~rd-^O_oXN1SsP1^NNJIy+hb literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__pycache__/json.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/representations/__pycache__/json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8edbd1cb2859f09f153b14872c0f4282bb68a9e3 GIT binary patch literal 1146 zcmZ`&y>C-V5a0Ft@QaOcL{3Q{jUyn!I>=MV6^C>>fy6~{Bmog9aP#!+T|3WyU$?st zaO6lvLR@#cj_4{ESAdR!|AWd9$kE4)NnXe^`(NH*U97BM1>)s+P z21$aLuhxL(NDM&A-an5OMKL;P4#|&p5Nay#Z-ihE{rA~-Q~M&`{KgSXR_D>9Xz~a)94t@@!`qQ z+MGDTL)6JU#5{u$R0$nY0t}5cR5my46=*syxuqrF<*m}N`=tk-Scl!;*KV$sXjqE~ zC8cUa+Va@#-`4Id-CcInku<%Kz>M~E$SKD-4AN=QHb2CLj;RGK5ZPF+G7mnMBEXh_PY)QKxxsVffbgi2{axbVUTIH}h_ ziPRNuu2Pj!IgIVQ9J1K7<%WE{2`pXTzJC4AioJ5>>Vo}8;%x*j7nIreX?WlEy{a9z z#d;Jj&M#cFxhLp_*sZnP2IY2Lbw<5QQBQoE(HJ1q>=GO$@Trud~xT*7(4h>02{f z*Lv=@b?(T%@nY@S)V8&7V4>p^fB)1koZ0#rR8RB^KX#Yi=cl(Odq2F%&vmcv=+>Xh zkCq4eR9~Ok%KlU6UEJ2^cJjsUjeTGOA8)mslR3w!Cn90gahUoy(nw282k>cV6JOOl zp9s(A>7=Bd)|bvp75N;o8Ccj!P>0qpK|~Ut{>o;-R4 5: + choices = self.choices[0:3] + choices.append('...') + choices.append(self.choices[-1]) + else: + choices = self.choices + return 'Name: {0}, type: {1}, choices: {2}'.format(self.name, self.type, choices) + + def __repr__(self): + return "{0}('{1}', default={2}, dest={3}, required={4}, ignore={5}, location={6}, " \ + "type=\"{7}\", choices={8}, action='{9}', help={10}, case_sensitive={11}, " \ + "operators={12}, store_missing={13}, trim={14}, nullable={15})".format( + self.__class__.__name__, self.name, self.default, self.dest, self.required, self.ignore, self.location, + self.type, self.choices, self.action, self.help, self.case_sensitive, + self.operators, self.store_missing, self.trim, self.nullable) + + def source(self, request): + """Pulls values off the request in the provided location + :param request: The flask request object to parse arguments from + """ + if isinstance(self.location, six.string_types): + value = getattr(request, self.location, MultiDict()) + if callable(value): + value = value() + if value is not None: + return value + else: + values = MultiDict() + for l in self.location: + value = getattr(request, l, None) + if callable(value): + value = value() + if value is not None: + values.update(value) + return values + + return MultiDict() + + def convert(self, value, op): + # Don't cast None + if value is None: + if self.nullable: + return None + else: + raise ValueError('Must not be null!') + + # and check if we're expecting a filestorage and haven't overridden `type` + # (required because the below instantiation isn't valid for FileStorage) + elif isinstance(value, FileStorage) and self.type == FileStorage: + return value + + try: + return self.type(value, self.name, op) + except TypeError: + try: + if self.type is decimal.Decimal: + return self.type(str(value)) + else: + return self.type(value, self.name) + except TypeError: + return self.type(value) + + def handle_validation_error(self, error, bundle_errors): + """Called when an error is raised while parsing. Aborts the request + with a 400 status and an error message + + :param error: the error that was raised + :param bundle_errors: do not abort when first error occurs, return a + dict with the name of the argument and the error message to be + bundled + """ + error_str = six.text_type(error) + error_msg = self.help.format(error_msg=error_str) if self.help else error_str + msg = {self.name: error_msg} + + if current_app.config.get("BUNDLE_ERRORS", False) or bundle_errors: + return error, msg + flask_restful.abort(400, message=msg) + + def parse(self, request, bundle_errors=False): + """Parses argument value(s) from the request, converting according to + the argument's type. + + :param request: The flask request object to parse arguments from + :param bundle_errors: Do not abort when first error occurs, return a + dict with the name of the argument and the error message to be + bundled + """ + source = self.source(request) + + results = [] + + # Sentinels + _not_found = False + _found = True + + for operator in self.operators: + name = self.name + operator.replace("=", "", 1) + if name in source: + # Account for MultiDict and regular dict + if hasattr(source, "getlist"): + values = source.getlist(name) + else: + values = source.get(name) + if not (isinstance(values, MutableSequence) and self.action == 'append'): + values = [values] + + for value in values: + if hasattr(value, "strip") and self.trim: + value = value.strip() + if hasattr(value, "lower") and not self.case_sensitive: + value = value.lower() + + if hasattr(self.choices, "__iter__"): + self.choices = [choice.lower() + for choice in self.choices] + + try: + value = self.convert(value, operator) + except Exception as error: + if self.ignore: + continue + return self.handle_validation_error(error, bundle_errors) + + if self.choices and value not in self.choices: + if current_app.config.get("BUNDLE_ERRORS", False) or bundle_errors: + return self.handle_validation_error( + ValueError(u"{0} is not a valid choice".format( + value)), bundle_errors) + self.handle_validation_error( + ValueError(u"{0} is not a valid choice".format( + value)), bundle_errors) + + if name in request.unparsed_arguments: + request.unparsed_arguments.pop(name) + results.append(value) + + if not results and self.required: + if isinstance(self.location, six.string_types): + error_msg = u"Missing required parameter in {0}".format( + _friendly_location.get(self.location, self.location) + ) + else: + friendly_locations = [_friendly_location.get(loc, loc) + for loc in self.location] + error_msg = u"Missing required parameter in {0}".format( + ' or '.join(friendly_locations) + ) + if current_app.config.get("BUNDLE_ERRORS", False) or bundle_errors: + return self.handle_validation_error(ValueError(error_msg), bundle_errors) + self.handle_validation_error(ValueError(error_msg), bundle_errors) + + if not results: + if callable(self.default): + return self.default(), _not_found + else: + return self.default, _not_found + + if self.action == 'append': + return results, _found + + if self.action == 'store' or len(results) == 1: + return results[0], _found + return results, _found + + +class RequestParser(object): + """Enables adding and parsing of multiple arguments in the context of a + single request. Ex:: + + from flask_restful import reqparse + + parser = reqparse.RequestParser() + parser.add_argument('foo') + parser.add_argument('int_bar', type=int) + args = parser.parse_args() + + :param bool trim: If enabled, trims whitespace on all arguments in this + parser + :param bool bundle_errors: If enabled, do not abort when first error occurs, + return a dict with the name of the argument and the error message to be + bundled and return all validation errors + """ + + def __init__(self, argument_class=Argument, namespace_class=Namespace, + trim=False, bundle_errors=False): + self.args = [] + self.argument_class = argument_class + self.namespace_class = namespace_class + self.trim = trim + self.bundle_errors = bundle_errors + + def add_argument(self, *args, **kwargs): + """Adds an argument to be parsed. + + Accepts either a single instance of Argument or arguments to be passed + into :class:`Argument`'s constructor. + + See :class:`Argument`'s constructor for documentation on the + available options. + """ + + if len(args) == 1 and isinstance(args[0], self.argument_class): + self.args.append(args[0]) + else: + self.args.append(self.argument_class(*args, **kwargs)) + + # Do not know what other argument classes are out there + if self.trim and self.argument_class is Argument: + # enable trim for appended element + self.args[-1].trim = kwargs.get('trim', self.trim) + + return self + + def parse_args(self, req=None, strict=False, http_error_code=400): + """Parse all arguments from the provided request and return the results + as a Namespace + + :param req: Can be used to overwrite request from Flask + :param strict: if req includes args not in parser, throw 400 BadRequest exception + :param http_error_code: use custom error code for `flask_restful.abort()` + """ + if req is None: + req = request + + namespace = self.namespace_class() + + # A record of arguments not yet parsed; as each is found + # among self.args, it will be popped out + req.unparsed_arguments = dict(self.argument_class('').source(req)) if strict else {} + errors = {} + for arg in self.args: + value, found = arg.parse(req, self.bundle_errors) + if isinstance(value, ValueError): + errors.update(found) + found = None + if found or arg.store_missing: + namespace[arg.dest or arg.name] = value + if errors: + flask_restful.abort(http_error_code, message=errors) + + if strict and req.unparsed_arguments: + raise exceptions.BadRequest('Unknown arguments: %s' + % ', '.join(req.unparsed_arguments.keys())) + + return namespace + + def copy(self): + """ Creates a copy of this RequestParser with the same set of arguments """ + parser_copy = self.__class__(self.argument_class, self.namespace_class) + parser_copy.args = deepcopy(self.args) + parser_copy.trim = self.trim + parser_copy.bundle_errors = self.bundle_errors + return parser_copy + + def replace_argument(self, name, *args, **kwargs): + """ Replace the argument matching the given name with a new version. """ + new_arg = self.argument_class(name, *args, **kwargs) + for index, arg in enumerate(self.args[:]): + if new_arg.name == arg.name: + del self.args[index] + self.args.append(new_arg) + break + return self + + def remove_argument(self, name): + """ Remove the argument matching the given name. """ + for index, arg in enumerate(self.args[:]): + if name == arg.name: + del self.args[index] + break + return self diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__init__.py new file mode 100644 index 00000000..8f267b9d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__init__.py @@ -0,0 +1,35 @@ +import sys + +try: + from collections.abc import OrderedDict +except ImportError: + from collections import OrderedDict + +from werkzeug.http import HTTP_STATUS_CODES + +PY3 = sys.version_info > (3,) + + +def http_status_message(code): + """Maps an HTTP status code to the textual status""" + return HTTP_STATUS_CODES.get(code, '') + + +def unpack(value): + """Return a three tuple of data, code, and headers""" + if not isinstance(value, tuple): + return value, 200, {} + + try: + data, code, headers = value + return data, code, headers + except ValueError: + pass + + try: + data, code = value + return data, code, {} + except ValueError: + pass + + return value, 200, {} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df9b185595df105cd704ae98fdc66905282cc2ef GIT binary patch literal 1252 zcmaJ=O=ufO6n?X_T1#51#H_$bLFK{_2%vQTcrXyq-g7sv#_AjSBFPMR68J_->u?9|0!*J z+&3rZB`9c{#YLwjEGM*7EK5j7#=>$Vk6ALZWF04VPsUDga+M&4tB46*VJb&m*$NfY zI$pJx1mnVH4JQ=!RX_Bcz+PA=FWQT9^H=N-V}G;h2+6p;#=&S#D!4ru~4}BM2QiHs!Uvw{4x&lF)GFOM2CH`^oyB47#Z)lyH~eA z>ZULBbUl?jxR~EhPj2hmUgxcYk+DvB_s#CeR5v~K>^F1bDUej|QF^#XaX#)D%6{Vf zXIW)FFdlgNH(MAU?c_Ur`$kuPMNDEEJJ~7tGE=1Ak|O;sa~*!j%%$m%Lj-lfOsLop z$%q>T0du7vg`()(b-DUHiMh~hMO^mDNX!>ZlH5AujZGG>6jjR&ntyl=nMDWKkhLhG zca~@Sz1OGYYv9A^vCq|U`g$|+;(*=Y7x7Ge6LAw2zLk()A=}d_nf_hB{8t*t%wr?- z&^WhmoZB7WH!j?#PYsP+KFW@g^Ur#dkRC&#$n+oj>k2%5EL4zBjcNGGyhgt#*XZA5 C;X4Qb literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__pycache__/cors.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/__pycache__/cors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bd5962fe58f9fc74e2de9b8310525bb916f8cae GIT binary patch literal 3413 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 CVUrgC literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/cors.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/cors.py new file mode 100644 index 00000000..523a014e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/cors.py @@ -0,0 +1,54 @@ +from datetime import timedelta +from flask import make_response, request, current_app +from functools import update_wrapper + + +def crossdomain(origin=None, methods=None, headers=None, expose_headers=None, + max_age=21600, attach_to_all=True, + automatic_options=True, credentials=False): + """ + http://flask.pocoo.org/snippets/56/ + """ + if methods is not None: + methods = ', '.join(sorted(x.upper() for x in methods)) + if headers is not None and not isinstance(headers, str): + headers = ', '.join(x.upper() for x in headers) + if expose_headers is not None and not isinstance(expose_headers, str): + expose_headers = ', '.join(x.upper() for x in expose_headers) + if not isinstance(origin, str): + origin = ', '.join(origin) + if isinstance(max_age, timedelta): + max_age = max_age.total_seconds() + + def get_methods(): + if methods is not None: + return methods + + options_resp = current_app.make_default_options_response() + return options_resp.headers['allow'] + + def decorator(f): + def wrapped_function(*args, **kwargs): + if automatic_options and request.method == 'OPTIONS': + resp = current_app.make_default_options_response() + else: + resp = make_response(f(*args, **kwargs)) + if not attach_to_all and request.method != 'OPTIONS': + return resp + + h = resp.headers + + h['Access-Control-Allow-Origin'] = origin + h['Access-Control-Allow-Methods'] = get_methods() + h['Access-Control-Max-Age'] = str(max_age) + if credentials: + h['Access-Control-Allow-Credentials'] = 'true' + if headers is not None: + h['Access-Control-Allow-Headers'] = headers + if expose_headers is not None: + h['Access-Control-Expose-Headers'] = expose_headers + return resp + + f.provide_automatic_options = False + return update_wrapper(wrapped_function, f) + return decorator diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/crypto.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/crypto.py new file mode 100644 index 00000000..972e289a --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_restful/utils/crypto.py @@ -0,0 +1,35 @@ +import pickle +from Crypto.Cipher import AES +from base64 import b64encode, b64decode + + +__all__ = "encrypt", "decrypt" + +BLOCK_SIZE = 16 +INTERRUPT = b'\0' # something impossible to put in a string +PADDING = b'\1' + + +def pad(data): + return data + INTERRUPT + PADDING * (BLOCK_SIZE - (len(data) + 1) % BLOCK_SIZE) + + +def strip(data): + return data.rstrip(PADDING).rstrip(INTERRUPT) + + +def create_cipher(key, seed): + if len(seed) != 16: + raise ValueError("Choose a seed of 16 bytes") + if len(key) != 32: + raise ValueError("Choose a key of 32 bytes") + return AES.new(key, AES.MODE_CBC, seed) + + +def encrypt(plaintext_data, key, seed): + plaintext_data = pickle.dumps(plaintext_data, pickle.HIGHEST_PROTOCOL) # whatever you give me I need to be able to restitute it + return b64encode(create_cipher(key, seed).encrypt(pad(plaintext_data))) + + +def decrypt(encrypted_data, key, seed): + return pickle.loads(strip(create_cipher(key, seed).decrypt(b64decode(encrypted_data)))) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA new file mode 100644 index 00000000..92f239cd --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA @@ -0,0 +1,109 @@ +Metadata-Version: 2.1 +Name: Flask-SQLAlchemy +Version: 3.1.1 +Summary: Add SQLAlchemy support to your Flask application. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Requires-Dist: flask>=2.2.5 +Requires-Dist: sqlalchemy>=2.0.16 +Project-URL: Changes, https://flask-sqlalchemy.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Issue Tracker, https://github.com/pallets-eco/flask-sqlalchemy/issues/ +Project-URL: Source Code, https://github.com/pallets-eco/flask-sqlalchemy/ + +Flask-SQLAlchemy +================ + +Flask-SQLAlchemy is an extension for `Flask`_ that adds support for +`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy +with Flask by providing useful defaults and extra helpers that make it +easier to accomplish common tasks. + +.. _Flask: https://palletsprojects.com/p/flask/ +.. _SQLAlchemy: https://www.sqlalchemy.org + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask-SQLAlchemy + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + from flask_sqlalchemy import SQLAlchemy + from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column + + app = Flask(__name__) + app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite" + + class Base(DeclarativeBase): + pass + + db = SQLAlchemy(app, model_class=Base) + + class User(db.Model): + id: Mapped[int] = mapped_column(db.Integer, primary_key=True) + username: Mapped[str] = mapped_column(db.String, unique=True, nullable=False) + + with app.app_context(): + db.create_all() + + db.session.add(User(username="example")) + db.session.commit() + + users = db.session.execute(db.select(User)).scalars() + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask-SQLAlchemy, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets-eco/flask-sqlalchemy/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask-SQLAlchemy and +other popular packages. In order to grow the community of contributors +and users, and allow the maintainers to devote more time to the +projects, `please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask-sqlalchemy.palletsprojects.com/ +- Changes: https://flask-sqlalchemy.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask-SQLAlchemy/ +- Source Code: https://github.com/pallets-eco/flask-sqlalchemy/ +- Issue Tracker: https://github.com/pallets-eco/flask-sqlalchemy/issues/ +- Website: https://palletsprojects.com/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD new file mode 100644 index 00000000..46e3d055 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD @@ -0,0 +1,27 @@ +flask_sqlalchemy-3.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask_sqlalchemy-3.1.1.dist-info/METADATA,sha256=lBxR1akBt7n9XBjIVTL2OV52OhCfFrb-Mqtoe0DCbR8,3432 +flask_sqlalchemy-3.1.1.dist-info/RECORD,, +flask_sqlalchemy-3.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_sqlalchemy-3.1.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask_sqlalchemy/__init__.py,sha256=he_w4qQQVS2Z1ms5GCTptDTXNOXBXw0n8zSuWCp8n6Y,653 +flask_sqlalchemy/__pycache__/__init__.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/cli.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/extension.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/model.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/pagination.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/query.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/record_queries.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/session.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/table.cpython-312.pyc,, +flask_sqlalchemy/__pycache__/track_modifications.cpython-312.pyc,, +flask_sqlalchemy/cli.py,sha256=pg3QDxP36GW2qnwe_CpPtkRhPchyVSGM6zlBNWuNCFE,484 +flask_sqlalchemy/extension.py,sha256=71tP_kNtb5VgZdafy_OH1sWdZOA6PaT7cJqX7tKgZ-k,38261 +flask_sqlalchemy/model.py,sha256=_mSisC2Eni0TgTyFWeN_O4LIexTeP_sVTdxh03yMK50,11461 +flask_sqlalchemy/pagination.py,sha256=JFpllrqkRkwacb8DAmQWaz9wsvQa0dypfSkhUDSC2ws,11119 +flask_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_sqlalchemy/query.py,sha256=Uls9qbmnpb9Vba43EDfsRP17eHJ0X4VG7SE22tH5R3g,3748 +flask_sqlalchemy/record_queries.py,sha256=ouS1ayj16h76LJprx13iYdoFZbm6m8OncrOgAVbG1Sk,3520 +flask_sqlalchemy/session.py,sha256=pBbtN8iDc8yuGVt0k18BvZHh2uEI7QPzZXO7eXrRi1g,3426 +flask_sqlalchemy/table.py,sha256=wAPOy8qwyAxpMwOIUJY4iMOultzz2W0D6xvBkQ7U2CE,859 +flask_sqlalchemy/track_modifications.py,sha256=yieyozj7IiVzwnAGZ-ZrgqrzjrUfG0kPrXBfW_hStSU,2755 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL new file mode 100644 index 00000000..3b5e64b5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__init__.py new file mode 100644 index 00000000..c2fa0591 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__init__.py @@ -0,0 +1,26 @@ +from __future__ import annotations + +import typing as t + +from .extension import SQLAlchemy + +__all__ = [ + "SQLAlchemy", +] + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Flask-SQLAlchemy 3.2. Use feature detection or" + " 'importlib.metadata.version(\"flask-sqlalchemy\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("flask-sqlalchemy") + + raise AttributeError(name) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42e59ddd12949486381d4d442134c2959e122015 GIT binary patch literal 1051 zcmZWo&r2IY6rR~6yKB-IwYFL)I(ms)FpGMu76P^)twPaK$YmKbW3q8~6K5x}5d|qd zw1?88{tIHS{VRIWdQe6R1=~Yz0X=!@Ony|c@9_4`H#6^j?|ZY~lgT)c_HCw7_^bhN zp%z_}Yi00qTKYXe0D&IxVGcqSYo3;ikO+x-Q9qW8Ni0@?Ih`0p{}9a?bbeC* z0tZ2vWA2uNaH#>?V0`)YtE`tVQoqh(63Q#QYYK>{()%*l1KYCn`UC*%DbWbv?FEB1ZjkO=50< zUU)cMpS+O=&19xC=uJq`8pXWIsLa7>Udf5d45eMaQfAz9S2I54m|%`G9ZnPDYpq=2 zhKJiyk6US3BIFd4OhfUN2L3M~%uUP!Hz&i!h-iR)Dti8vU}_YhnioRox?sz;S!mOB9E8P^8xZW- z3kxfY_F{H^%HF8DTRxWEFuO*Bnk_Z3D|KEh2Q!(eX*+Z|ovg^-aDj$)t25_D3fpnq zz~zpUsnpdR3sOAEPR?;qR==lctVp*D&Wyyzogc>Ib93z69QtMUeMx>wHZ?8z5?<*b zIeIoU+)RL;hgU%Fi8p&e-=ovi*l}v?G-Vy9tfMEhC#kt3bMAM1cz^IDK5`Ttxs-W< z6=nVMBO)PZLT6M?HrR^sOg5-nrieSvT2&2O@=0*bv|ZyW K-U~-t3H}2Am?1|1 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dea21b48fed6cb0c99ed60f16c7f033b0b8e8d2a GIT binary patch literal 1029 zcmZuw%WD%s7@yfZnr>RHErNp5Mez}^*|c7yh)~-K6;i>+rBXMOooRQ|-Pv?zQcYez&)JzI&DVltkoJrTUT>4vdG>5}1 z;XF`8xdE5ck#5(7U|dRSC6#)BcEuGPbJZ+225y0quRwNQo8~C z7`|0}7v&PmZ?3a>S1KkLHSW5~F-Co+oYB(#IgiMN{FNA`!#vNj1FqOTWmQFBGbsa6 zGTb@cfK@6HN-aO2%#)T1tT?^|ZfP)1${wS6V~kR1D2G8XEk`~s72!5B2&V?|JR?4C z*ziNiWK6392#)hGb{X@rJ=Eo*M?BkMem&G^IoBnkwud@o$GD7U8>Wg;Hert?i6!C^ zMLq2DVa!a(FdhHK3Nx0)iO(!6mk?bM1@^;4P*V~{kD#!fvUy9w0h28dE}e?YDe=sy zshdT!I5shCF4o*-pG565ml$6%J-2LD>&glE`TX#RDP6^es>EI(^Gup?CDz~6P1|$x z)p|IvPxHhfNFcf+@(w@)ZRJ!P^1)O)d!TXk=Z_T1Uc)lF z>+jBvok`}jFfEv>3BKG%U0dCjN}MxPevH>=b6ufsS#ve;Lcc`RpfIiKRhQ3)ScR#$ zx_Az8?yt}mL?F=zu#>q6!>xJjl8D|3JZmHe0KO+M#-GuNP1OGt9p6r8@Ii3|?7sl2 C?hG^l literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f458b6bfdc9e7740e8b2e6ffc71aa9d589ef0d9 GIT binary patch literal 39958 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 WZBMM(@cc<-tkl&0sX%u|-v2KE2_`@Q literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/model.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/model.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17235d57ff2c18644e7901db3f0898d51f61ed2b GIT binary patch literal 13380 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 Id2NmV1pyT$ZvX%Q literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/query.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/query.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1400646fb466654e94672dd8d58ea74583311986 GIT binary patch literal 4520 zcmcgw&2JmW6`v)!6iJa1C4VS!<9K2@cA3hgWakhtZ3?A^ivYF|$1ac%0l356p|sL| z&@;P|X)u9N_+TT4xF3KnJ@k-E;9UC$^qfm_C@d^uAV83VZ%VBKtxkP!cKKy14w3?0 zNpIhL?)&)7dvEl4sZ=2F{O$as)la4f`34*PM~@lp@rS@{6N^}yLtL$)X~?IXR3ok4 z8CP#)lfDTz*T^eA?G)U}#w73=OLvNHsZmmV7Wk>gltxnIx5S#bO{^TxufN#;=9xHTy%$BX1rlc zv++xN+yG{qaMI8$(nwhvXqC4LR{FNy$N)EKWq{KarvsO@QtBsbWvz+7=y`I`k5#mC zx3i52kh~P>N(@#88LwWswCtE`-0jl3=`bnl#)tB{!{WZGFWl;Nl)0*w7*vKWHH~iB z!5Wpm%PGGR2u58VtofEKP~F3yZhVXXKbH~Qv6lhiv*FqhgE_kudT z26pcV+hw9lH+UBfrQ8-g(FgdbQB^9MXU4gc)WTK4ZPCL?-XaWKNiBe)y;vfpLZ`FP$!Pzyw!92OP zZhIDUYHz)D?Q-q%@`a_^_0YcQGBARuZE|n3=Gd)TrwhpR&R3Vt)ubKpvmIt`fK;;9 z2E1=HhiHe@i1bc3Du6&uUo^qmH_HQ$Bt3H=i+mZ#EwVdBre;5W_wKv*_(#n#+{r(NiNs7GfIJz1>H;*j$-$tyuci|6L8_N}0#e!-q*4k} zpZ_qV+P0AY4^WM`_NReF6hU`U0s_#`mDn*j(xQwb2nsO^MB+gMP>4hDj*4n#-)pn6 z*GBu$WpW+}_^pV3Yus&o^!~wK6Gvd)nAb4(s8DbZm~Du$&-U9@GEahm*VobKPdp=| zN#q}$&`zBq0s?f9@ApD58T0&mq?_I%H`4EsEv=GalW?+r7z7vy{>Qk&Y}t=0?{EpR zItfJ-;*Vimh7P;q@OVfjV@agO6P$#epNx`0#2bcvW?4@K{UL}}DteR#y`!vTO@70S zN-O?|;L+iOM2-QM8UjwDFZ)m{z;=D0CE;P%a}FlTUjYG_mDBmfokMfmul?b*Kh?h| z9{=}O<)aVEr@kzo`lS8f^zxUdm%o^P^Pfb^FD6mrL9w=*hUUJUh8=!CJxl($xU8rD zp3#6_15Gj*P@`Oji>Bg=F1yhjwDKzGHvKS&bQ3Z}VD|GB!Z!zh3c{y=*(O1M44~YD zOw~*GGCln>?S2AB2rMb~1}t2LjNPTogS66?9CDIpQO9=e07E_|Z520Z3vwx>o;doO zp%9Q_-c%j?kV&FZe+!Jf$()d@dT&&K1vG686gKuj&{Ul52!9i@e6qMoA+HZg6}6R@ zEFRZ#X>oB_Pb8)updJzq7T@1nF43e+YE#%eb^sGRK_0ipghZ4NZ~)aQ6!~;XdEIUg z2UO4-u{lh1pdJFG!FlOVAKRBh;S89^@8XuW7s#g+QfIeLe=`Q$0B#x12!NE)C2e(~ zc9x+6r(()e)^i*(k7B?o!itAxhs+0Jk~H3zEC6OIsX7VkVpd}grX|0^zm#Bk95@tE zqH?I@q_Pzhrdz(S&ibD7V|Tj-r`|A>O$Mg|we`UTyxq1<8zR+@l+Z9nPX%n7TwGK* z8N+BL8|ljW;sk_UL6N+K?|xYtsHT zOq3YnZ;`!=8Y!RHnLWBQb7bep@tx;i-Z=`*xxLavxv)zn@sRJ0ZN{0uDF*MsV^ z*HtyvenAF;_TajK$uquBh%+#$l8I}up93!{NK|i8DY#z%L?^3aWnaM=N@K;L+EJ$E z`%bLrZ|kNpF@Hdc5xcW zr$i~GszQPPOi%>tNx25(Hu)|!q38Byi~8)|3zI;OP3nugl)ON9PR#GjpV>L~;?B`y z-%Y=w7k0B``uW`ng~0Du z%BV>@gbNvHA|M5mC>wM;aAYGbh^B@&kSf+EX&~ZfIB9eQZsJhJ0KqZ_-@3ZKs6r(w zBv^opnLsNFO!cwui^yR$tL(9#`(ZvO?!eANN~ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f73123cadb9cc3b1ae52492272b2c28d356bc802 GIT binary patch literal 4849 zcmb_gO>7&-6`ox#e?(HEX#K^if5wiRnEoMSJ81$zNTAw^W7n1tTP|7_@p8o-Qlyr< z^z70$1qxP?6m@_AN!o*51VMY~!G;5*hZJxxZH@tY5v!ykHa6fOzU1aaE(-Y6_hz}I z!lsB19e}fM{@%QKKi`|--~0Qc1j?U}d{z9opO7!H;g_ICNE?3z;u_J3E*YdEWhDt| z*^slc_y)28@l~=x_y&wnC7cbn=R~r7Vk}yTW#ghxG5RY5*#SWZflg!-f(`*am>mSV zUk|^bWRpxT@9{|dP0xEcLct1_>R`))ZkY* zD$ApxM}lX)x=ulW*@R zJ_^(ULZpo}5Z8z!`Ge)Qe103hx>O{-+-FHj)_w!ak28ll3yc~i+o4v0a+bHa&UAXA z#(15U%!0)$LShP(nA#SS+RV1$Bx(98Of4~+YMezWln#$l!CPRNg;J4D=$fNVPO5R$U zxAe_hT>{_mw18fO$HX$X0KQex>J$Qy&NEuIz&&dN7dPUt*D}*AWU+( z$7F=QDh%FsdJsmV7(;nOvuzjxGiW;cu|}O*^|1x)<=Y7zkhTpn;E1prK#@2Js3@1~ zn(8sdp8>_SgPCeI$3heVO&bU*;9Q^)ih#mw;ZzkcqGv64NVP8*U=j>NUuh|shXBId z0I2gO*+4jZRLPvP!4Mg?sG0Ucxn$~^kvVZJhoNu5Hb6EOY2&9*Un7iUC7opDa{$qh&Sa+O zfk_zA6`+EG3IP@FP!U1(L0=Rp7KF3~NvD&HLiKoRz>TU1%=Ht18QKew8IbU?+`|yf z>_mzOvT1sTd60l;I8msX`3d2{z2|;hAMObT^%&Y+h&6{E``EE?)C)C?*8fWkJg%oB zbSy<7W6%bju}tRnb>RC^&`D33bvN2YdpB4xEX{FYfe-0!#7A>C0BqcdA4mC4t_BNY zwg#t=Hl79I8flO+e0vM@en(bcf;-e%a#Nat5J4a0BT&J;L9v-puyGU0;c`XXh>z4u zLtV#6`<>G;#m1#8ZRM?HEDnf*+ zg0ra*!ZicwxC-H+8SRmHY&9kt)Zm;?(&zV8>%vVXO#w`5;nQ9fF_z zJXF6TUn|jIw=YvgL{3)$~s8}XWWr_27$>`$iTM6 z)pqWh0~-bf{<_0j0Z^=GJf*l1TT>Zeo8yM?`o>JRzYS2Ta6mWaH^B#iU5J^*lF2qZ zMOgJ#@`E7WN%+}&p;{q#l=!b_e>wZk%d6XteDvBUdp=WUH+3EU=qDdL|5Q$S$kyw~ zU`J`=1z@vTsXjK@Qk^(${3FEgZ4kBN+I7OmVR0(J!|>s#W^kPXoV6QO;ECaOs&Ye% zmo#3qZDasGgpp(ru^W)9)J)=o-Bo0j@oz47>CeUB1=Ur5@M{gUfP5eh(fy@5{>p2hSx+8Ba?1FgH zQ7scy@spcf;gr#Sol4&M@u@CSXj+K*UYXA*&ckIry( zvPV*yqZ4sF*CT0SNv3-rNvWm2$(p%nT9?chQ$e1@31~I}>K?qKZd0RPY#^)%ZX9=V zW2H*ff~N$chT8{e$tmIO*$u;0u?o*7H{O1_74TK#_7&8kVa;oX%^`=7cGj}-;p2wz zS*kO5ky>h@WQdEP8z}%$euzjMaZw<{v1zhWB6bq#^S{{s+(hl7bshSr~%0G z?zf~*BirvMx2-4lHj{hTlZTth!+$!mmVExU)J#sSoNNv6cxUqZh1KM)m6LbkL+f$c zjMKIF?v?2;qKQ^w`0XoiURh7$m4yBikRwLVeMH1tP(afHSxTYzL(*4I;4rqMPYoODX(- z7_hapmk83+A|HtPu7cN_R7jX3l?0|g}aLf zffomeh;CnJL(dB_qj`xycuNeMo!iBu$fS2&d6A!m0fb%qXHY!|NRo7y?EaE$`J4=V zPPW`7+rK1Zcgd4L+$BSI$*zsiPU*mdV-k`3*QL>>H2QCOM9MrMP{Ex;9(#bzjb~)( Rw6qabq=OF!c1oUU{sYsw*qQ(U literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/session.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/session.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e492311aa4d6806ce8690867a2b8f8cd12967684 GIT binary patch literal 4553 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 GqW=M<5QE$R literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/table.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/table.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93cd214eae865efab2b46ab37bd2bbb0239fbb43 GIT binary patch literal 1844 zcmb7E&1)M+6o0c{TFH{*#4dKfj3_x&5Nnm@(nBc?7>W<}p-CZZ3(H!&wq>tY_RPwy zj1MjtVjtR`ihJmxlpY#FkNqopN!yDVXdCb;w@s8#<5S<8U0IIv0hxvOelzpty*Kao zc7Cr^N`T|HYY&z`(*cfXG8kqCSpRbb2M|EOB4{(0F~VA;xw_JZYbtHE3r&qd+jff# zH24?-eHQ{FG*>4EE{FOqMx)`5^t77!fMAWu5kHPQiJ!DOu~=x*;$RpVVEum(+{Sc5 za9IGZ7V4|^z-Xug7HB`PBAow%0w!hM%?(}i`KQmHqIqBk#;)Oo;`Kmb5Pua zB^Fq_W!Kz;FPUrIfLcjf-c5fo3Ky^>_F^jzytS~`)bgxZt}g(vKGo#_dT@s=+<}@Y z4G~65(unIUwAQ{LEr`=9jg!FnRD@hO;hG9qUZ%AQis3!^D6OFzcqRktN2<3oQ%OsPxZxo-BD@ zyAyOH!e!6f==xETvmY{n1VX9HJdcm`>DdI2P2D4Z^4QEK}PR~oc=Q6N>G=lI%Di_c;^T%9l_+kFmn%P U9$V9_vG>WhxAt#60ffrS|CZW{x&QzG literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eed60ef6a0fb51d30523e86d879e31f195979923 GIT binary patch literal 3626 zcmc&$O>7&-6`ox#mn;5>mK4#JOi7W{Sd1aDjvTp_VyS{;JBlN^tz`sZ>MYjWp+suA zWM)@(DbT1}6o`xluyT@mYED56>5xnB2GUzEq-24@zye&j7vGquryPpD+2xXypd>(l z&;jA>$dGzJtS0KG$9jCc$fjj&s2pdR6DyN|=m*6-i^BSLU zSzJiCEiPs~38`jl$$Aq$OLl4gY#5}pKuFOTUGDxg~Vw!r22rLQBSFU z;9bB2z`KD5fuAk#(YBW?bd;k$Mb~qtVy1Jt5oi763L#iGWhI}7ZtId_Fi}qCbQAyD z1XW91$zmg~B=JkOKG1k>V#9y{tD$U8#hNjk%w@A_)5Pj(_zq6x2p&FeNY;MM`auyW z91eHb1=QyvL7KuI5tyoR4Tvi+N$-qA08?E2P4@kt+wR=>4)cYo6^5AN;EAH zvyqLt3MlG{Q@_2Ra!Ok|-8!6xN&_{$z4O$sq)bfU(AYW9pxq-mO}nEcm!l$; z3`NFw;h3qYr41A7)F%_1%n?=2fWgkL?^_bPWnf~& z@Uo&COPRE;Dq3uAZecz)KRtUP_R&guHLJk9BnFGP8`IKvV)=r(l+#B?F1!&l(k31T zfGsPF*odVx#aNb&k2FO~F5zq;W)d*TfT(mTowSiVk}pt?Z2t;5&6WV4@g9%|=$YXE z_{MK+jpLFaASDQ8ZQ{i%>|KaxSr@}Z z2#DRF@G%h29s{wH=LT0mW*yL(I)qsyyQ$n65SU*PW$JKqtO#mUiU&&_QcV_@WvRoa z$s(lqlxr55wCCn8-kpAT=Itx<@5>9noSwNZ z&)=AxyE->By)btpev^u69dHIHUdgM9iKz(X2b(zRC+s)~+hZz1=}M&+sY}QAs9Q}F z6R=|YsgySq>VY76oHVJQ6}z+wX^{pWzaz=ZxIp=|3Ta`LF*&)U=zz?qhp^wE;_^L( zEE?2f0>h?3TXK0!EMQX6)={?sH5OABgfcuZsLyUB%$9k|AwwV-p92BZ`nsO_&hAUW zzxz5XzDU^@DfLY5_@+Qp6_NMUqwa^@>q{l6cfTd{DDp6}DV3yGncVxZcXOyD4OBfs zulNm;+>>RgYt6HMrs_rEo^Oz=WpeH6vyRSp!Zr z4eqoJ{)K-s_LX;SX8-(!FMnEk{qowiiod_?@BeIc$A9i?4}|#I2Z0HL>yad28*Wwd zDhSP${74ei>L)@cC4u94pDS`FCP8zOoRA7+!t}x9Ry#RaGIh{9eo$v?Vjb|jSx<-z zJD+2%$QAi*eyf(w9Kf}J9=qbC8~oUf=s={U35e}7phI@<*W8^9V2<>{0K(3l3aorl z@vfq+V1w2!P8)GXt&+oyN(BS!>SLD;Jr`Wf%X1}Za8DYqx{=iLJ!lyGzLNOAMZ>NC2O7QuckOTx$C`sX z8$sm9V2*klm?3X~qJa@I%DNYU(Arb00Sq$6)b6B)6+$k7d=wIFZoXL?*z4u*=7Oir5L!!IX@!CxO9)2WVgLRfMjx&{Yxo%0l0s&~G6)Dp;wt z+5=Cd9LbItNvP(kTzlVqPjiR|DJFr` z!rC4UZG?JdIkf_juq+eymvChi@@ajMawhdQUOi-h*+LD)i2Z(ZTa2_aYp}@*OQ$YI zMEgIe+j>V?SE7Y48n6^2MtV_KG=s4B1`RB{|MM#{+_y8==i=8I|3oFZ<_Gbt0fdzn z@+Kqfy=C8FR^73X#r#K=;J01&-%G@|LEbk0c%zN0y1O!xc~qF literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/cli.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/cli.py new file mode 100644 index 00000000..d7d7e4be --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/cli.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +import typing as t + +from flask import current_app + + +def add_models_to_shell() -> dict[str, t.Any]: + """Registered with :meth:`~flask.Flask.shell_context_processor` if + ``add_models_to_shell`` is enabled. Adds the ``db`` instance and all model classes + to ``flask shell``. + """ + db = current_app.extensions["sqlalchemy"] + out = {m.class_.__name__: m.class_ for m in db.Model._sa_registry.mappers} + out["db"] = db + return out diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/extension.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/extension.py new file mode 100644 index 00000000..43e1b9a4 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/extension.py @@ -0,0 +1,1008 @@ +from __future__ import annotations + +import os +import types +import typing as t +import warnings +from weakref import WeakKeyDictionary + +import sqlalchemy as sa +import sqlalchemy.event as sa_event +import sqlalchemy.exc as sa_exc +import sqlalchemy.orm as sa_orm +from flask import abort +from flask import current_app +from flask import Flask +from flask import has_app_context + +from .model import _QueryProperty +from .model import BindMixin +from .model import DefaultMeta +from .model import DefaultMetaNoName +from .model import Model +from .model import NameMixin +from .pagination import Pagination +from .pagination import SelectPagination +from .query import Query +from .session import _app_ctx_id +from .session import Session +from .table import _Table + +_O = t.TypeVar("_O", bound=object) # Based on sqlalchemy.orm._typing.py + + +# Type accepted for model_class argument +_FSA_MCT = t.TypeVar( + "_FSA_MCT", + bound=t.Union[ + t.Type[Model], + sa_orm.DeclarativeMeta, + t.Type[sa_orm.DeclarativeBase], + t.Type[sa_orm.DeclarativeBaseNoMeta], + ], +) + + +# Type returned by make_declarative_base +class _FSAModel(Model): + metadata: sa.MetaData + + +def _get_2x_declarative_bases( + model_class: _FSA_MCT, +) -> list[t.Type[t.Union[sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta]]]: + return [ + b + for b in model_class.__bases__ + if issubclass(b, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) + ] + + +class SQLAlchemy: + """Integrates SQLAlchemy with Flask. This handles setting up one or more engines, + associating tables and models with specific engines, and cleaning up connections and + sessions after each request. + + Only the engine configuration is specific to each application, other things like + the model, table, metadata, and session are shared for all applications using that + extension instance. Call :meth:`init_app` to configure the extension on an + application. + + After creating the extension, create model classes by subclassing :attr:`Model`, and + table classes with :attr:`Table`. These can be accessed before :meth:`init_app` is + called, making it possible to define the models separately from the application. + + Accessing :attr:`session` and :attr:`engine` requires an active Flask application + context. This includes methods like :meth:`create_all` which use the engine. + + This class also provides access to names in SQLAlchemy's ``sqlalchemy`` and + ``sqlalchemy.orm`` modules. For example, you can use ``db.Column`` and + ``db.relationship`` instead of importing ``sqlalchemy.Column`` and + ``sqlalchemy.orm.relationship``. This can be convenient when defining models. + + :param app: Call :meth:`init_app` on this Flask application now. + :param metadata: Use this as the default :class:`sqlalchemy.schema.MetaData`. Useful + for setting a naming convention. + :param session_options: Arguments used by :attr:`session` to create each session + instance. A ``scopefunc`` key will be passed to the scoped session, not the + session instance. See :class:`sqlalchemy.orm.sessionmaker` for a list of + arguments. + :param query_class: Use this as the default query class for models and dynamic + relationships. The query interface is considered legacy in SQLAlchemy. + :param model_class: Use this as the model base class when creating the declarative + model class :attr:`Model`. Can also be a fully created declarative model class + for further customization. + :param engine_options: Default arguments used when creating every engine. These are + lower precedence than application config. See :func:`sqlalchemy.create_engine` + for a list of arguments. + :param add_models_to_shell: Add the ``db`` instance and all model classes to + ``flask shell``. + + .. versionchanged:: 3.1.0 + The ``metadata`` parameter can still be used with SQLAlchemy 1.x classes, + but is ignored when using SQLAlchemy 2.x style of declarative classes. + Instead, specify metadata on your Base class. + + .. versionchanged:: 3.1.0 + Added the ``disable_autonaming`` parameter. + + .. versionchanged:: 3.1.0 + Changed ``model_class`` parameter to accepta SQLAlchemy 2.x + declarative base subclass. + + .. versionchanged:: 3.0 + An active Flask application context is always required to access ``session`` and + ``engine``. + + .. versionchanged:: 3.0 + Separate ``metadata`` are used for each bind key. + + .. versionchanged:: 3.0 + The ``engine_options`` parameter is applied as defaults before per-engine + configuration. + + .. versionchanged:: 3.0 + The session class can be customized in ``session_options``. + + .. versionchanged:: 3.0 + Added the ``add_models_to_shell`` parameter. + + .. versionchanged:: 3.0 + Engines are created when calling ``init_app`` rather than the first time they + are accessed. + + .. versionchanged:: 3.0 + All parameters except ``app`` are keyword-only. + + .. versionchanged:: 3.0 + The extension instance is stored directly as ``app.extensions["sqlalchemy"]``. + + .. versionchanged:: 3.0 + Setup methods are renamed with a leading underscore. They are considered + internal interfaces which may change at any time. + + .. versionchanged:: 3.0 + Removed the ``use_native_unicode`` parameter and config. + + .. versionchanged:: 2.4 + Added the ``engine_options`` parameter. + + .. versionchanged:: 2.1 + Added the ``metadata``, ``query_class``, and ``model_class`` parameters. + + .. versionchanged:: 2.1 + Use the same query class across ``session``, ``Model.query`` and + ``Query``. + + .. versionchanged:: 0.16 + ``scopefunc`` is accepted in ``session_options``. + + .. versionchanged:: 0.10 + Added the ``session_options`` parameter. + """ + + def __init__( + self, + app: Flask | None = None, + *, + metadata: sa.MetaData | None = None, + session_options: dict[str, t.Any] | None = None, + query_class: type[Query] = Query, + model_class: _FSA_MCT = Model, # type: ignore[assignment] + engine_options: dict[str, t.Any] | None = None, + add_models_to_shell: bool = True, + disable_autonaming: bool = False, + ): + if session_options is None: + session_options = {} + + self.Query = query_class + """The default query class used by ``Model.query`` and ``lazy="dynamic"`` + relationships. + + .. warning:: + The query interface is considered legacy in SQLAlchemy. + + Customize this by passing the ``query_class`` parameter to the extension. + """ + + self.session = self._make_scoped_session(session_options) + """A :class:`sqlalchemy.orm.scoping.scoped_session` that creates instances of + :class:`.Session` scoped to the current Flask application context. The session + will be removed, returning the engine connection to the pool, when the + application context exits. + + Customize this by passing ``session_options`` to the extension. + + This requires that a Flask application context is active. + + .. versionchanged:: 3.0 + The session is scoped to the current app context. + """ + + self.metadatas: dict[str | None, sa.MetaData] = {} + """Map of bind keys to :class:`sqlalchemy.schema.MetaData` instances. The + ``None`` key refers to the default metadata, and is available as + :attr:`metadata`. + + Customize the default metadata by passing the ``metadata`` parameter to the + extension. This can be used to set a naming convention. When metadata for + another bind key is created, it copies the default's naming convention. + + .. versionadded:: 3.0 + """ + + if metadata is not None: + if len(_get_2x_declarative_bases(model_class)) > 0: + warnings.warn( + "When using SQLAlchemy 2.x style of declarative classes," + " the `metadata` should be an attribute of the base class." + "The metadata passed into SQLAlchemy() is ignored.", + DeprecationWarning, + stacklevel=2, + ) + else: + metadata.info["bind_key"] = None + self.metadatas[None] = metadata + + self.Table = self._make_table_class() + """A :class:`sqlalchemy.schema.Table` class that chooses a metadata + automatically. + + Unlike the base ``Table``, the ``metadata`` argument is not required. If it is + not given, it is selected based on the ``bind_key`` argument. + + :param bind_key: Used to select a different metadata. + :param args: Arguments passed to the base class. These are typically the table's + name, columns, and constraints. + :param kwargs: Arguments passed to the base class. + + .. versionchanged:: 3.0 + This is a subclass of SQLAlchemy's ``Table`` rather than a function. + """ + + self.Model = self._make_declarative_base( + model_class, disable_autonaming=disable_autonaming + ) + """A SQLAlchemy declarative model class. Subclass this to define database + models. + + If a model does not set ``__tablename__``, it will be generated by converting + the class name from ``CamelCase`` to ``snake_case``. It will not be generated + if the model looks like it uses single-table inheritance. + + If a model or parent class sets ``__bind_key__``, it will use that metadata and + database engine. Otherwise, it will use the default :attr:`metadata` and + :attr:`engine`. This is ignored if the model sets ``metadata`` or ``__table__``. + + For code using the SQLAlchemy 1.x API, customize this model by subclassing + :class:`.Model` and passing the ``model_class`` parameter to the extension. + A fully created declarative model class can be + passed as well, to use a custom metaclass. + + For code using the SQLAlchemy 2.x API, customize this model by subclassing + :class:`sqlalchemy.orm.DeclarativeBase` or + :class:`sqlalchemy.orm.DeclarativeBaseNoMeta` + and passing the ``model_class`` parameter to the extension. + """ + + if engine_options is None: + engine_options = {} + + self._engine_options = engine_options + self._app_engines: WeakKeyDictionary[Flask, dict[str | None, sa.engine.Engine]] + self._app_engines = WeakKeyDictionary() + self._add_models_to_shell = add_models_to_shell + + if app is not None: + self.init_app(app) + + def __repr__(self) -> str: + if not has_app_context(): + return f"<{type(self).__name__}>" + + message = f"{type(self).__name__} {self.engine.url}" + + if len(self.engines) > 1: + message = f"{message} +{len(self.engines) - 1}" + + return f"<{message}>" + + def init_app(self, app: Flask) -> None: + """Initialize a Flask application for use with this extension instance. This + must be called before accessing the database engine or session with the app. + + This sets default configuration values, then configures the extension on the + application and creates the engines for each bind key. Therefore, this must be + called after the application has been configured. Changes to application config + after this call will not be reflected. + + The following keys from ``app.config`` are used: + + - :data:`.SQLALCHEMY_DATABASE_URI` + - :data:`.SQLALCHEMY_ENGINE_OPTIONS` + - :data:`.SQLALCHEMY_ECHO` + - :data:`.SQLALCHEMY_BINDS` + - :data:`.SQLALCHEMY_RECORD_QUERIES` + - :data:`.SQLALCHEMY_TRACK_MODIFICATIONS` + + :param app: The Flask application to initialize. + """ + if "sqlalchemy" in app.extensions: + raise RuntimeError( + "A 'SQLAlchemy' instance has already been registered on this Flask app." + " Import and use that instance instead." + ) + + app.extensions["sqlalchemy"] = self + app.teardown_appcontext(self._teardown_session) + + if self._add_models_to_shell: + from .cli import add_models_to_shell + + app.shell_context_processor(add_models_to_shell) + + basic_uri: str | sa.engine.URL | None = app.config.setdefault( + "SQLALCHEMY_DATABASE_URI", None + ) + basic_engine_options = self._engine_options.copy() + basic_engine_options.update( + app.config.setdefault("SQLALCHEMY_ENGINE_OPTIONS", {}) + ) + echo: bool = app.config.setdefault("SQLALCHEMY_ECHO", False) + config_binds: dict[ + str | None, str | sa.engine.URL | dict[str, t.Any] + ] = app.config.setdefault("SQLALCHEMY_BINDS", {}) + engine_options: dict[str | None, dict[str, t.Any]] = {} + + # Build the engine config for each bind key. + for key, value in config_binds.items(): + engine_options[key] = self._engine_options.copy() + + if isinstance(value, (str, sa.engine.URL)): + engine_options[key]["url"] = value + else: + engine_options[key].update(value) + + # Build the engine config for the default bind key. + if basic_uri is not None: + basic_engine_options["url"] = basic_uri + + if "url" in basic_engine_options: + engine_options.setdefault(None, {}).update(basic_engine_options) + + if not engine_options: + raise RuntimeError( + "Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set." + ) + + engines = self._app_engines.setdefault(app, {}) + + # Dispose existing engines in case init_app is called again. + if engines: + for engine in engines.values(): + engine.dispose() + + engines.clear() + + # Create the metadata and engine for each bind key. + for key, options in engine_options.items(): + self._make_metadata(key) + options.setdefault("echo", echo) + options.setdefault("echo_pool", echo) + self._apply_driver_defaults(options, app) + engines[key] = self._make_engine(key, options, app) + + if app.config.setdefault("SQLALCHEMY_RECORD_QUERIES", False): + from . import record_queries + + for engine in engines.values(): + record_queries._listen(engine) + + if app.config.setdefault("SQLALCHEMY_TRACK_MODIFICATIONS", False): + from . import track_modifications + + track_modifications._listen(self.session) + + def _make_scoped_session( + self, options: dict[str, t.Any] + ) -> sa_orm.scoped_session[Session]: + """Create a :class:`sqlalchemy.orm.scoping.scoped_session` around the factory + from :meth:`_make_session_factory`. The result is available as :attr:`session`. + + The scope function can be customized using the ``scopefunc`` key in the + ``session_options`` parameter to the extension. By default it uses the current + thread or greenlet id. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param options: The ``session_options`` parameter from ``__init__``. Keyword + arguments passed to the session factory. A ``scopefunc`` key is popped. + + .. versionchanged:: 3.0 + The session is scoped to the current app context. + + .. versionchanged:: 3.0 + Renamed from ``create_scoped_session``, this method is internal. + """ + scope = options.pop("scopefunc", _app_ctx_id) + factory = self._make_session_factory(options) + return sa_orm.scoped_session(factory, scope) + + def _make_session_factory( + self, options: dict[str, t.Any] + ) -> sa_orm.sessionmaker[Session]: + """Create the SQLAlchemy :class:`sqlalchemy.orm.sessionmaker` used by + :meth:`_make_scoped_session`. + + To customize, pass the ``session_options`` parameter to :class:`SQLAlchemy`. To + customize the session class, subclass :class:`.Session` and pass it as the + ``class_`` key. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param options: The ``session_options`` parameter from ``__init__``. Keyword + arguments passed to the session factory. + + .. versionchanged:: 3.0 + The session class can be customized. + + .. versionchanged:: 3.0 + Renamed from ``create_session``, this method is internal. + """ + options.setdefault("class_", Session) + options.setdefault("query_cls", self.Query) + return sa_orm.sessionmaker(db=self, **options) + + def _teardown_session(self, exc: BaseException | None) -> None: + """Remove the current session at the end of the request. + + :meta private: + + .. versionadded:: 3.0 + """ + self.session.remove() + + def _make_metadata(self, bind_key: str | None) -> sa.MetaData: + """Get or create a :class:`sqlalchemy.schema.MetaData` for the given bind key. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param bind_key: The name of the metadata being created. + + .. versionadded:: 3.0 + """ + if bind_key in self.metadatas: + return self.metadatas[bind_key] + + if bind_key is not None: + # Copy the naming convention from the default metadata. + naming_convention = self._make_metadata(None).naming_convention + else: + naming_convention = None + + # Set the bind key in info to be used by session.get_bind. + metadata = sa.MetaData( + naming_convention=naming_convention, info={"bind_key": bind_key} + ) + self.metadatas[bind_key] = metadata + return metadata + + def _make_table_class(self) -> type[_Table]: + """Create a SQLAlchemy :class:`sqlalchemy.schema.Table` class that chooses a + metadata automatically based on the ``bind_key``. The result is available as + :attr:`Table`. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + .. versionadded:: 3.0 + """ + + class Table(_Table): + def __new__( + cls, *args: t.Any, bind_key: str | None = None, **kwargs: t.Any + ) -> Table: + # If a metadata arg is passed, go directly to the base Table. Also do + # this for no args so the correct error is shown. + if not args or (len(args) >= 2 and isinstance(args[1], sa.MetaData)): + return super().__new__(cls, *args, **kwargs) + + metadata = self._make_metadata(bind_key) + return super().__new__(cls, *[args[0], metadata, *args[1:]], **kwargs) + + return Table + + def _make_declarative_base( + self, + model_class: _FSA_MCT, + disable_autonaming: bool = False, + ) -> t.Type[_FSAModel]: + """Create a SQLAlchemy declarative model class. The result is available as + :attr:`Model`. + + To customize, subclass :class:`.Model` and pass it as ``model_class`` to + :class:`SQLAlchemy`. To customize at the metaclass level, pass an already + created declarative model class as ``model_class``. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param model_class: A model base class, or an already created declarative model + class. + + :param disable_autonaming: Turns off automatic tablename generation in models. + + .. versionchanged:: 3.1.0 + Added support for passing SQLAlchemy 2.x base class as model class. + Added optional ``disable_autonaming`` parameter. + + .. versionchanged:: 3.0 + Renamed with a leading underscore, this method is internal. + + .. versionchanged:: 2.3 + ``model`` can be an already created declarative model class. + """ + model: t.Type[_FSAModel] + declarative_bases = _get_2x_declarative_bases(model_class) + if len(declarative_bases) > 1: + # raise error if more than one declarative base is found + raise ValueError( + "Only one declarative base can be passed to SQLAlchemy." + " Got: {}".format(model_class.__bases__) + ) + elif len(declarative_bases) == 1: + body = dict(model_class.__dict__) + body["__fsa__"] = self + mixin_classes = [BindMixin, NameMixin, Model] + if disable_autonaming: + mixin_classes.remove(NameMixin) + model = types.new_class( + "FlaskSQLAlchemyBase", + (*mixin_classes, *model_class.__bases__), + {"metaclass": type(declarative_bases[0])}, + lambda ns: ns.update(body), + ) + elif not isinstance(model_class, sa_orm.DeclarativeMeta): + metadata = self._make_metadata(None) + metaclass = DefaultMetaNoName if disable_autonaming else DefaultMeta + model = sa_orm.declarative_base( + metadata=metadata, cls=model_class, name="Model", metaclass=metaclass + ) + else: + model = model_class # type: ignore[assignment] + + if None not in self.metadatas: + # Use the model's metadata as the default metadata. + model.metadata.info["bind_key"] = None + self.metadatas[None] = model.metadata + else: + # Use the passed in default metadata as the model's metadata. + model.metadata = self.metadatas[None] + + model.query_class = self.Query + model.query = _QueryProperty() # type: ignore[assignment] + model.__fsa__ = self + return model + + def _apply_driver_defaults(self, options: dict[str, t.Any], app: Flask) -> None: + """Apply driver-specific configuration to an engine. + + SQLite in-memory databases use ``StaticPool`` and disable ``check_same_thread``. + File paths are relative to the app's :attr:`~flask.Flask.instance_path`, + which is created if it doesn't exist. + + MySQL sets ``charset="utf8mb4"``, and ``pool_timeout`` defaults to 2 hours. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param options: Arguments passed to the engine. + :param app: The application that the engine configuration belongs to. + + .. versionchanged:: 3.0 + SQLite paths are relative to ``app.instance_path``. It does not use + ``NullPool`` if ``pool_size`` is 0. Driver-level URIs are supported. + + .. versionchanged:: 3.0 + MySQL sets ``charset="utf8mb4". It does not set ``pool_size`` to 10. It + does not set ``pool_recycle`` if not using a queue pool. + + .. versionchanged:: 3.0 + Renamed from ``apply_driver_hacks``, this method is internal. It does not + return anything. + + .. versionchanged:: 2.5 + Returns ``(sa_url, options)``. + """ + url = sa.engine.make_url(options["url"]) + + if url.drivername in {"sqlite", "sqlite+pysqlite"}: + if url.database is None or url.database in {"", ":memory:"}: + options["poolclass"] = sa.pool.StaticPool + + if "connect_args" not in options: + options["connect_args"] = {} + + options["connect_args"]["check_same_thread"] = False + else: + # the url might look like sqlite:///file:path?uri=true + is_uri = url.query.get("uri", False) + + if is_uri: + db_str = url.database[5:] + else: + db_str = url.database + + if not os.path.isabs(db_str): + os.makedirs(app.instance_path, exist_ok=True) + db_str = os.path.join(app.instance_path, db_str) + + if is_uri: + db_str = f"file:{db_str}" + + options["url"] = url.set(database=db_str) + elif url.drivername.startswith("mysql"): + # set queue defaults only when using queue pool + if ( + "pool_class" not in options + or options["pool_class"] is sa.pool.QueuePool + ): + options.setdefault("pool_recycle", 7200) + + if "charset" not in url.query: + options["url"] = url.update_query_dict({"charset": "utf8mb4"}) + + def _make_engine( + self, bind_key: str | None, options: dict[str, t.Any], app: Flask + ) -> sa.engine.Engine: + """Create the :class:`sqlalchemy.engine.Engine` for the given bind key and app. + + To customize, use :data:`.SQLALCHEMY_ENGINE_OPTIONS` or + :data:`.SQLALCHEMY_BINDS` config. Pass ``engine_options`` to :class:`SQLAlchemy` + to set defaults for all engines. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param bind_key: The name of the engine being created. + :param options: Arguments passed to the engine. + :param app: The application that the engine configuration belongs to. + + .. versionchanged:: 3.0 + Renamed from ``create_engine``, this method is internal. + """ + return sa.engine_from_config(options, prefix="") + + @property + def metadata(self) -> sa.MetaData: + """The default metadata used by :attr:`Model` and :attr:`Table` if no bind key + is set. + """ + return self.metadatas[None] + + @property + def engines(self) -> t.Mapping[str | None, sa.engine.Engine]: + """Map of bind keys to :class:`sqlalchemy.engine.Engine` instances for current + application. The ``None`` key refers to the default engine, and is available as + :attr:`engine`. + + To customize, set the :data:`.SQLALCHEMY_BINDS` config, and set defaults by + passing the ``engine_options`` parameter to the extension. + + This requires that a Flask application context is active. + + .. versionadded:: 3.0 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + + if app not in self._app_engines: + raise RuntimeError( + "The current Flask app is not registered with this 'SQLAlchemy'" + " instance. Did you forget to call 'init_app', or did you create" + " multiple 'SQLAlchemy' instances?" + ) + + return self._app_engines[app] + + @property + def engine(self) -> sa.engine.Engine: + """The default :class:`~sqlalchemy.engine.Engine` for the current application, + used by :attr:`session` if the :attr:`Model` or :attr:`Table` being queried does + not set a bind key. + + To customize, set the :data:`.SQLALCHEMY_ENGINE_OPTIONS` config, and set + defaults by passing the ``engine_options`` parameter to the extension. + + This requires that a Flask application context is active. + """ + return self.engines[None] + + def get_engine( + self, bind_key: str | None = None, **kwargs: t.Any + ) -> sa.engine.Engine: + """Get the engine for the given bind key for the current application. + This requires that a Flask application context is active. + + :param bind_key: The name of the engine. + + .. deprecated:: 3.0 + Will be removed in Flask-SQLAlchemy 3.2. Use ``engines[key]`` instead. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + """ + warnings.warn( + "'get_engine' is deprecated and will be removed in Flask-SQLAlchemy" + " 3.2. Use 'engine' or 'engines[key]' instead. If you're using" + " Flask-Migrate or Alembic, you'll need to update your 'env.py' file.", + DeprecationWarning, + stacklevel=2, + ) + + if "bind" in kwargs: + bind_key = kwargs.pop("bind") + + return self.engines[bind_key] + + def get_or_404( + self, + entity: type[_O], + ident: t.Any, + *, + description: str | None = None, + **kwargs: t.Any, + ) -> _O: + """Like :meth:`session.get() ` but aborts with a + ``404 Not Found`` error instead of returning ``None``. + + :param entity: The model class to query. + :param ident: The primary key to query. + :param description: A custom message to show on the error page. + :param kwargs: Extra arguments passed to ``session.get()``. + + .. versionchanged:: 3.1 + Pass extra keyword arguments to ``session.get()``. + + .. versionadded:: 3.0 + """ + value = self.session.get(entity, ident, **kwargs) + + if value is None: + abort(404, description=description) + + return value + + def first_or_404( + self, statement: sa.sql.Select[t.Any], *, description: str | None = None + ) -> t.Any: + """Like :meth:`Result.scalar() `, but aborts + with a ``404 Not Found`` error instead of returning ``None``. + + :param statement: The ``select`` statement to execute. + :param description: A custom message to show on the error page. + + .. versionadded:: 3.0 + """ + value = self.session.execute(statement).scalar() + + if value is None: + abort(404, description=description) + + return value + + def one_or_404( + self, statement: sa.sql.Select[t.Any], *, description: str | None = None + ) -> t.Any: + """Like :meth:`Result.scalar_one() `, + but aborts with a ``404 Not Found`` error instead of raising ``NoResultFound`` + or ``MultipleResultsFound``. + + :param statement: The ``select`` statement to execute. + :param description: A custom message to show on the error page. + + .. versionadded:: 3.0 + """ + try: + return self.session.execute(statement).scalar_one() + except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): + abort(404, description=description) + + def paginate( + self, + select: sa.sql.Select[t.Any], + *, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = None, + error_out: bool = True, + count: bool = True, + ) -> Pagination: + """Apply an offset and limit to a select statment based on the current page and + number of items per page, returning a :class:`.Pagination` object. + + The statement should select a model class, like ``select(User)``. This applies + ``unique()`` and ``scalars()`` modifiers to the result, so compound selects will + not return the expected results. + + :param select: The ``select`` statement to paginate. + :param page: The current page, used to calculate the offset. Defaults to the + ``page`` query arg during a request, or 1 otherwise. + :param per_page: The maximum number of items on a page, used to calculate the + offset and limit. Defaults to the ``per_page`` query arg during a request, + or 20 otherwise. + :param max_per_page: The maximum allowed value for ``per_page``, to limit a + user-provided value. Use ``None`` for no limit. Defaults to 100. + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + :param count: Calculate the total number of values by issuing an extra count + query. For very complex queries this may be inaccurate or slow, so it can be + disabled and set manually if necessary. + + .. versionchanged:: 3.0 + The ``count`` query is more efficient. + + .. versionadded:: 3.0 + """ + return SelectPagination( + select=select, + session=self.session(), + page=page, + per_page=per_page, + max_per_page=max_per_page, + error_out=error_out, + count=count, + ) + + def _call_for_binds( + self, bind_key: str | None | list[str | None], op_name: str + ) -> None: + """Call a method on each metadata. + + :meta private: + + :param bind_key: A bind key or list of keys. Defaults to all binds. + :param op_name: The name of the method to call. + + .. versionchanged:: 3.0 + Renamed from ``_execute_for_all_tables``. + """ + if bind_key == "__all__": + keys: list[str | None] = list(self.metadatas) + elif bind_key is None or isinstance(bind_key, str): + keys = [bind_key] + else: + keys = bind_key + + for key in keys: + try: + engine = self.engines[key] + except KeyError: + message = f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." + + if key is None: + message = f"'SQLALCHEMY_DATABASE_URI' config is not set. {message}" + + raise sa_exc.UnboundExecutionError(message) from None + + metadata = self.metadatas[key] + getattr(metadata, op_name)(bind=engine) + + def create_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: + """Create tables that do not exist in the database by calling + ``metadata.create_all()`` for all or some bind keys. This does not + update existing tables, use a migration library for that. + + This requires that a Flask application context is active. + + :param bind_key: A bind key or list of keys to create the tables for. Defaults + to all binds. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + + .. versionchanged:: 0.12 + Added the ``bind`` and ``app`` parameters. + """ + self._call_for_binds(bind_key, "create_all") + + def drop_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: + """Drop tables by calling ``metadata.drop_all()`` for all or some bind keys. + + This requires that a Flask application context is active. + + :param bind_key: A bind key or list of keys to drop the tables from. Defaults to + all binds. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + + .. versionchanged:: 0.12 + Added the ``bind`` and ``app`` parameters. + """ + self._call_for_binds(bind_key, "drop_all") + + def reflect(self, bind_key: str | None | list[str | None] = "__all__") -> None: + """Load table definitions from the database by calling ``metadata.reflect()`` + for all or some bind keys. + + This requires that a Flask application context is active. + + :param bind_key: A bind key or list of keys to reflect the tables from. Defaults + to all binds. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + + .. versionchanged:: 0.12 + Added the ``bind`` and ``app`` parameters. + """ + self._call_for_binds(bind_key, "reflect") + + def _set_rel_query(self, kwargs: dict[str, t.Any]) -> None: + """Apply the extension's :attr:`Query` class as the default for relationships + and backrefs. + + :meta private: + """ + kwargs.setdefault("query_class", self.Query) + + if "backref" in kwargs: + backref = kwargs["backref"] + + if isinstance(backref, str): + backref = (backref, {}) + + backref[1].setdefault("query_class", self.Query) + + def relationship( + self, *args: t.Any, **kwargs: t.Any + ) -> sa_orm.RelationshipProperty[t.Any]: + """A :func:`sqlalchemy.orm.relationship` that applies this extension's + :attr:`Query` class for dynamic relationships and backrefs. + + .. versionchanged:: 3.0 + The :attr:`Query` class is set on ``backref``. + """ + self._set_rel_query(kwargs) + return sa_orm.relationship(*args, **kwargs) + + def dynamic_loader( + self, argument: t.Any, **kwargs: t.Any + ) -> sa_orm.RelationshipProperty[t.Any]: + """A :func:`sqlalchemy.orm.dynamic_loader` that applies this extension's + :attr:`Query` class for relationships and backrefs. + + .. versionchanged:: 3.0 + The :attr:`Query` class is set on ``backref``. + """ + self._set_rel_query(kwargs) + return sa_orm.dynamic_loader(argument, **kwargs) + + def _relation( + self, *args: t.Any, **kwargs: t.Any + ) -> sa_orm.RelationshipProperty[t.Any]: + """A :func:`sqlalchemy.orm.relationship` that applies this extension's + :attr:`Query` class for dynamic relationships and backrefs. + + SQLAlchemy 2.0 removes this name, use ``relationship`` instead. + + :meta private: + + .. versionchanged:: 3.0 + The :attr:`Query` class is set on ``backref``. + """ + self._set_rel_query(kwargs) + f = sa_orm.relationship + return f(*args, **kwargs) + + def __getattr__(self, name: str) -> t.Any: + if name == "relation": + return self._relation + + if name == "event": + return sa_event + + if name.startswith("_"): + raise AttributeError(name) + + for mod in (sa, sa_orm): + if hasattr(mod, name): + return getattr(mod, name) + + raise AttributeError(name) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/model.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/model.py new file mode 100644 index 00000000..c6f9e5a9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/model.py @@ -0,0 +1,330 @@ +from __future__ import annotations + +import re +import typing as t + +import sqlalchemy as sa +import sqlalchemy.orm as sa_orm + +from .query import Query + +if t.TYPE_CHECKING: + from .extension import SQLAlchemy + + +class _QueryProperty: + """A class property that creates a query object for a model. + + :meta private: + """ + + def __get__(self, obj: Model | None, cls: type[Model]) -> Query: + return cls.query_class( + cls, session=cls.__fsa__.session() # type: ignore[arg-type] + ) + + +class Model: + """The base class of the :attr:`.SQLAlchemy.Model` declarative model class. + + To define models, subclass :attr:`db.Model <.SQLAlchemy.Model>`, not this. To + customize ``db.Model``, subclass this and pass it as ``model_class`` to + :class:`.SQLAlchemy`. To customize ``db.Model`` at the metaclass level, pass an + already created declarative model class as ``model_class``. + """ + + __fsa__: t.ClassVar[SQLAlchemy] + """Internal reference to the extension object. + + :meta private: + """ + + query_class: t.ClassVar[type[Query]] = Query + """Query class used by :attr:`query`. Defaults to :attr:`.SQLAlchemy.Query`, which + defaults to :class:`.Query`. + """ + + query: t.ClassVar[Query] = _QueryProperty() # type: ignore[assignment] + """A SQLAlchemy query for a model. Equivalent to ``db.session.query(Model)``. Can be + customized per-model by overriding :attr:`query_class`. + + .. warning:: + The query interface is considered legacy in SQLAlchemy. Prefer using + ``session.execute(select())`` instead. + """ + + def __repr__(self) -> str: + state = sa.inspect(self) + assert state is not None + + if state.transient: + pk = f"(transient {id(self)})" + elif state.pending: + pk = f"(pending {id(self)})" + else: + pk = ", ".join(map(str, state.identity)) + + return f"<{type(self).__name__} {pk}>" + + +class BindMetaMixin(type): + """Metaclass mixin that sets a model's ``metadata`` based on its ``__bind_key__``. + + If the model sets ``metadata`` or ``__table__`` directly, ``__bind_key__`` is + ignored. If the ``metadata`` is the same as the parent model, it will not be set + directly on the child model. + """ + + __fsa__: SQLAlchemy + metadata: sa.MetaData + + def __init__( + cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any + ) -> None: + if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__): + bind_key = getattr(cls, "__bind_key__", None) + parent_metadata = getattr(cls, "metadata", None) + metadata = cls.__fsa__._make_metadata(bind_key) + + if metadata is not parent_metadata: + cls.metadata = metadata + + super().__init__(name, bases, d, **kwargs) + + +class BindMixin: + """DeclarativeBase mixin to set a model's ``metadata`` based on ``__bind_key__``. + + If no ``__bind_key__`` is specified, the model will use the default metadata + provided by ``DeclarativeBase`` or ``DeclarativeBaseNoMeta``. + If the model doesn't set ``metadata`` or ``__table__`` directly + and does set ``__bind_key__``, the model will use the metadata + for the specified bind key. + If the ``metadata`` is the same as the parent model, it will not be set + directly on the child model. + + .. versionchanged:: 3.1.0 + """ + + __fsa__: SQLAlchemy + metadata: sa.MetaData + + @classmethod + def __init_subclass__(cls: t.Type[BindMixin], **kwargs: t.Dict[str, t.Any]) -> None: + if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__) and hasattr( + cls, "__bind_key__" + ): + bind_key = getattr(cls, "__bind_key__", None) + parent_metadata = getattr(cls, "metadata", None) + metadata = cls.__fsa__._make_metadata(bind_key) + + if metadata is not parent_metadata: + cls.metadata = metadata + + super().__init_subclass__(**kwargs) + + +class NameMetaMixin(type): + """Metaclass mixin that sets a model's ``__tablename__`` by converting the + ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models + that do not otherwise define ``__tablename__``. If a model does not define a primary + key, it will not generate a name or ``__table__``, for single-table inheritance. + """ + + metadata: sa.MetaData + __tablename__: str + __table__: sa.Table + + def __init__( + cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any + ) -> None: + if should_set_tablename(cls): + cls.__tablename__ = camel_to_snake_case(cls.__name__) + + super().__init__(name, bases, d, **kwargs) + + # __table_cls__ has run. If no table was created, use the parent table. + if ( + "__tablename__" not in cls.__dict__ + and "__table__" in cls.__dict__ + and cls.__dict__["__table__"] is None + ): + del cls.__table__ + + def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: + """This is called by SQLAlchemy during mapper setup. It determines the final + table object that the model will use. + + If no primary key is found, that indicates single-table inheritance, so no table + will be created and ``__tablename__`` will be unset. + """ + schema = kwargs.get("schema") + + if schema is None: + key = args[0] + else: + key = f"{schema}.{args[0]}" + + # Check if a table with this name already exists. Allows reflected tables to be + # applied to models by name. + if key in cls.metadata.tables: + return sa.Table(*args, **kwargs) + + # If a primary key is found, create a table for joined-table inheritance. + for arg in args: + if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( + arg, sa.PrimaryKeyConstraint + ): + return sa.Table(*args, **kwargs) + + # If no base classes define a table, return one that's missing a primary key + # so SQLAlchemy shows the correct error. + for base in cls.__mro__[1:-1]: + if "__table__" in base.__dict__: + break + else: + return sa.Table(*args, **kwargs) + + # Single-table inheritance, use the parent table name. __init__ will unset + # __table__ based on this. + if "__tablename__" in cls.__dict__: + del cls.__tablename__ + + return None + + +class NameMixin: + """DeclarativeBase mixin that sets a model's ``__tablename__`` by converting the + ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models + that do not otherwise define ``__tablename__``. If a model does not define a primary + key, it will not generate a name or ``__table__``, for single-table inheritance. + + .. versionchanged:: 3.1.0 + """ + + metadata: sa.MetaData + __tablename__: str + __table__: sa.Table + + @classmethod + def __init_subclass__(cls: t.Type[NameMixin], **kwargs: t.Dict[str, t.Any]) -> None: + if should_set_tablename(cls): + cls.__tablename__ = camel_to_snake_case(cls.__name__) + + super().__init_subclass__(**kwargs) + + # __table_cls__ has run. If no table was created, use the parent table. + if ( + "__tablename__" not in cls.__dict__ + and "__table__" in cls.__dict__ + and cls.__dict__["__table__"] is None + ): + del cls.__table__ + + @classmethod + def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: + """This is called by SQLAlchemy during mapper setup. It determines the final + table object that the model will use. + + If no primary key is found, that indicates single-table inheritance, so no table + will be created and ``__tablename__`` will be unset. + """ + schema = kwargs.get("schema") + + if schema is None: + key = args[0] + else: + key = f"{schema}.{args[0]}" + + # Check if a table with this name already exists. Allows reflected tables to be + # applied to models by name. + if key in cls.metadata.tables: + return sa.Table(*args, **kwargs) + + # If a primary key is found, create a table for joined-table inheritance. + for arg in args: + if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( + arg, sa.PrimaryKeyConstraint + ): + return sa.Table(*args, **kwargs) + + # If no base classes define a table, return one that's missing a primary key + # so SQLAlchemy shows the correct error. + for base in cls.__mro__[1:-1]: + if "__table__" in base.__dict__: + break + else: + return sa.Table(*args, **kwargs) + + # Single-table inheritance, use the parent table name. __init__ will unset + # __table__ based on this. + if "__tablename__" in cls.__dict__: + del cls.__tablename__ + + return None + + +def should_set_tablename(cls: type) -> bool: + """Determine whether ``__tablename__`` should be generated for a model. + + - If no class in the MRO sets a name, one should be generated. + - If a declared attr is found, it should be used instead. + - If a name is found, it should be used if the class is a mixin, otherwise one + should be generated. + - Abstract models should not have one generated. + + Later, ``__table_cls__`` will determine if the model looks like single or + joined-table inheritance. If no primary key is found, the name will be unset. + """ + if ( + cls.__dict__.get("__abstract__", False) + or ( + not issubclass(cls, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) + and not any(isinstance(b, sa_orm.DeclarativeMeta) for b in cls.__mro__[1:]) + ) + or any( + (b is sa_orm.DeclarativeBase or b is sa_orm.DeclarativeBaseNoMeta) + for b in cls.__bases__ + ) + ): + return False + + for base in cls.__mro__: + if "__tablename__" not in base.__dict__: + continue + + if isinstance(base.__dict__["__tablename__"], sa_orm.declared_attr): + return False + + return not ( + base is cls + or base.__dict__.get("__abstract__", False) + or not ( + # SQLAlchemy 1.x + isinstance(base, sa_orm.DeclarativeMeta) + # 2.x: DeclarativeBas uses this as metaclass + or isinstance(base, sa_orm.decl_api.DeclarativeAttributeIntercept) + # 2.x: DeclarativeBaseNoMeta doesn't use a metaclass + or issubclass(base, sa_orm.DeclarativeBaseNoMeta) + ) + ) + + return True + + +def camel_to_snake_case(name: str) -> str: + """Convert a ``CamelCase`` name to ``snake_case``.""" + name = re.sub(r"((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))", r"_\1", name) + return name.lower().lstrip("_") + + +class DefaultMeta(BindMetaMixin, NameMetaMixin, sa_orm.DeclarativeMeta): + """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and + ``__tablename__`` support. + """ + + +class DefaultMetaNoName(BindMetaMixin, sa_orm.DeclarativeMeta): + """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and + ``__tablename__`` support. + """ diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/pagination.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/pagination.py new file mode 100644 index 00000000..3d49d6e0 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/pagination.py @@ -0,0 +1,364 @@ +from __future__ import annotations + +import typing as t +from math import ceil + +import sqlalchemy as sa +import sqlalchemy.orm as sa_orm +from flask import abort +from flask import request + + +class Pagination: + """Apply an offset and limit to the query based on the current page and number of + items per page. + + Don't create pagination objects manually. They are created by + :meth:`.SQLAlchemy.paginate` and :meth:`.Query.paginate`. + + This is a base class, a subclass must implement :meth:`_query_items` and + :meth:`_query_count`. Those methods will use arguments passed as ``kwargs`` to + perform the queries. + + :param page: The current page, used to calculate the offset. Defaults to the + ``page`` query arg during a request, or 1 otherwise. + :param per_page: The maximum number of items on a page, used to calculate the + offset and limit. Defaults to the ``per_page`` query arg during a request, + or 20 otherwise. + :param max_per_page: The maximum allowed value for ``per_page``, to limit a + user-provided value. Use ``None`` for no limit. Defaults to 100. + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + :param count: Calculate the total number of values by issuing an extra count + query. For very complex queries this may be inaccurate or slow, so it can be + disabled and set manually if necessary. + :param kwargs: Information about the query to paginate. Different subclasses will + require different arguments. + + .. versionchanged:: 3.0 + Iterating over a pagination object iterates over its items. + + .. versionchanged:: 3.0 + Creating instances manually is not a public API. + """ + + def __init__( + self, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = 100, + error_out: bool = True, + count: bool = True, + **kwargs: t.Any, + ) -> None: + self._query_args = kwargs + page, per_page = self._prepare_page_args( + page=page, + per_page=per_page, + max_per_page=max_per_page, + error_out=error_out, + ) + + self.page: int = page + """The current page.""" + + self.per_page: int = per_page + """The maximum number of items on a page.""" + + self.max_per_page: int | None = max_per_page + """The maximum allowed value for ``per_page``.""" + + items = self._query_items() + + if not items and page != 1 and error_out: + abort(404) + + self.items: list[t.Any] = items + """The items on the current page. Iterating over the pagination object is + equivalent to iterating over the items. + """ + + if count: + total = self._query_count() + else: + total = None + + self.total: int | None = total + """The total number of items across all pages.""" + + @staticmethod + def _prepare_page_args( + *, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = None, + error_out: bool = True, + ) -> tuple[int, int]: + if request: + if page is None: + try: + page = int(request.args.get("page", 1)) + except (TypeError, ValueError): + if error_out: + abort(404) + + page = 1 + + if per_page is None: + try: + per_page = int(request.args.get("per_page", 20)) + except (TypeError, ValueError): + if error_out: + abort(404) + + per_page = 20 + else: + if page is None: + page = 1 + + if per_page is None: + per_page = 20 + + if max_per_page is not None: + per_page = min(per_page, max_per_page) + + if page < 1: + if error_out: + abort(404) + else: + page = 1 + + if per_page < 1: + if error_out: + abort(404) + else: + per_page = 20 + + return page, per_page + + @property + def _query_offset(self) -> int: + """The index of the first item to query, passed to ``offset()``. + + :meta private: + + .. versionadded:: 3.0 + """ + return (self.page - 1) * self.per_page + + def _query_items(self) -> list[t.Any]: + """Execute the query to get the items on the current page. + + Uses init arguments stored in :attr:`_query_args`. + + :meta private: + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + def _query_count(self) -> int: + """Execute the query to get the total number of items. + + Uses init arguments stored in :attr:`_query_args`. + + :meta private: + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + @property + def first(self) -> int: + """The number of the first item on the page, starting from 1, or 0 if there are + no items. + + .. versionadded:: 3.0 + """ + if len(self.items) == 0: + return 0 + + return (self.page - 1) * self.per_page + 1 + + @property + def last(self) -> int: + """The number of the last item on the page, starting from 1, inclusive, or 0 if + there are no items. + + .. versionadded:: 3.0 + """ + first = self.first + return max(first, first + len(self.items) - 1) + + @property + def pages(self) -> int: + """The total number of pages.""" + if self.total == 0 or self.total is None: + return 0 + + return ceil(self.total / self.per_page) + + @property + def has_prev(self) -> bool: + """``True`` if this is not the first page.""" + return self.page > 1 + + @property + def prev_num(self) -> int | None: + """The previous page number, or ``None`` if this is the first page.""" + if not self.has_prev: + return None + + return self.page - 1 + + def prev(self, *, error_out: bool = False) -> Pagination: + """Query the :class:`Pagination` object for the previous page. + + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + """ + p = type(self)( + page=self.page - 1, + per_page=self.per_page, + error_out=error_out, + count=False, + **self._query_args, + ) + p.total = self.total + return p + + @property + def has_next(self) -> bool: + """``True`` if this is not the last page.""" + return self.page < self.pages + + @property + def next_num(self) -> int | None: + """The next page number, or ``None`` if this is the last page.""" + if not self.has_next: + return None + + return self.page + 1 + + def next(self, *, error_out: bool = False) -> Pagination: + """Query the :class:`Pagination` object for the next page. + + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + """ + p = type(self)( + page=self.page + 1, + per_page=self.per_page, + max_per_page=self.max_per_page, + error_out=error_out, + count=False, + **self._query_args, + ) + p.total = self.total + return p + + def iter_pages( + self, + *, + left_edge: int = 2, + left_current: int = 2, + right_current: int = 4, + right_edge: int = 2, + ) -> t.Iterator[int | None]: + """Yield page numbers for a pagination widget. Skipped pages between the edges + and middle are represented by a ``None``. + + For example, if there are 20 pages and the current page is 7, the following + values are yielded. + + .. code-block:: python + + 1, 2, None, 5, 6, 7, 8, 9, 10, 11, None, 19, 20 + + :param left_edge: How many pages to show from the first page. + :param left_current: How many pages to show left of the current page. + :param right_current: How many pages to show right of the current page. + :param right_edge: How many pages to show from the last page. + + .. versionchanged:: 3.0 + Improved efficiency of calculating what to yield. + + .. versionchanged:: 3.0 + ``right_current`` boundary is inclusive. + + .. versionchanged:: 3.0 + All parameters are keyword-only. + """ + pages_end = self.pages + 1 + + if pages_end == 1: + return + + left_end = min(1 + left_edge, pages_end) + yield from range(1, left_end) + + if left_end == pages_end: + return + + mid_start = max(left_end, self.page - left_current) + mid_end = min(self.page + right_current + 1, pages_end) + + if mid_start - left_end > 0: + yield None + + yield from range(mid_start, mid_end) + + if mid_end == pages_end: + return + + right_start = max(mid_end, pages_end - right_edge) + + if right_start - mid_end > 0: + yield None + + yield from range(right_start, pages_end) + + def __iter__(self) -> t.Iterator[t.Any]: + yield from self.items + + +class SelectPagination(Pagination): + """Returned by :meth:`.SQLAlchemy.paginate`. Takes ``select`` and ``session`` + arguments in addition to the :class:`Pagination` arguments. + + .. versionadded:: 3.0 + """ + + def _query_items(self) -> list[t.Any]: + select = self._query_args["select"] + select = select.limit(self.per_page).offset(self._query_offset) + session = self._query_args["session"] + return list(session.execute(select).unique().scalars()) + + def _query_count(self) -> int: + select = self._query_args["select"] + sub = select.options(sa_orm.lazyload("*")).order_by(None).subquery() + session = self._query_args["session"] + out = session.execute(sa.select(sa.func.count()).select_from(sub)).scalar() + return out # type: ignore[no-any-return] + + +class QueryPagination(Pagination): + """Returned by :meth:`.Query.paginate`. Takes a ``query`` argument in addition to + the :class:`Pagination` arguments. + + .. versionadded:: 3.0 + """ + + def _query_items(self) -> list[t.Any]: + query = self._query_args["query"] + out = query.limit(self.per_page).offset(self._query_offset).all() + return out # type: ignore[no-any-return] + + def _query_count(self) -> int: + # Query.count automatically disables eager loads + out = self._query_args["query"].order_by(None).count() + return out # type: ignore[no-any-return] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/py.typed b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/query.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/query.py new file mode 100644 index 00000000..35f927d2 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/query.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy.exc as sa_exc +import sqlalchemy.orm as sa_orm +from flask import abort + +from .pagination import Pagination +from .pagination import QueryPagination + + +class Query(sa_orm.Query): # type: ignore[type-arg] + """SQLAlchemy :class:`~sqlalchemy.orm.query.Query` subclass with some extra methods + useful for querying in a web application. + + This is the default query class for :attr:`.Model.query`. + + .. versionchanged:: 3.0 + Renamed to ``Query`` from ``BaseQuery``. + """ + + def get_or_404(self, ident: t.Any, description: str | None = None) -> t.Any: + """Like :meth:`~sqlalchemy.orm.Query.get` but aborts with a ``404 Not Found`` + error instead of returning ``None``. + + :param ident: The primary key to query. + :param description: A custom message to show on the error page. + """ + rv = self.get(ident) + + if rv is None: + abort(404, description=description) + + return rv + + def first_or_404(self, description: str | None = None) -> t.Any: + """Like :meth:`~sqlalchemy.orm.Query.first` but aborts with a ``404 Not Found`` + error instead of returning ``None``. + + :param description: A custom message to show on the error page. + """ + rv = self.first() + + if rv is None: + abort(404, description=description) + + return rv + + def one_or_404(self, description: str | None = None) -> t.Any: + """Like :meth:`~sqlalchemy.orm.Query.one` but aborts with a ``404 Not Found`` + error instead of raising ``NoResultFound`` or ``MultipleResultsFound``. + + :param description: A custom message to show on the error page. + + .. versionadded:: 3.0 + """ + try: + return self.one() + except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): + abort(404, description=description) + + def paginate( + self, + *, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = None, + error_out: bool = True, + count: bool = True, + ) -> Pagination: + """Apply an offset and limit to the query based on the current page and number + of items per page, returning a :class:`.Pagination` object. + + :param page: The current page, used to calculate the offset. Defaults to the + ``page`` query arg during a request, or 1 otherwise. + :param per_page: The maximum number of items on a page, used to calculate the + offset and limit. Defaults to the ``per_page`` query arg during a request, + or 20 otherwise. + :param max_per_page: The maximum allowed value for ``per_page``, to limit a + user-provided value. Use ``None`` for no limit. Defaults to 100. + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + :param count: Calculate the total number of values by issuing an extra count + query. For very complex queries this may be inaccurate or slow, so it can be + disabled and set manually if necessary. + + .. versionchanged:: 3.0 + All parameters are keyword-only. + + .. versionchanged:: 3.0 + The ``count`` query is more efficient. + + .. versionchanged:: 3.0 + ``max_per_page`` defaults to 100. + """ + return QueryPagination( + query=self, + page=page, + per_page=per_page, + max_per_page=max_per_page, + error_out=error_out, + count=count, + ) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/record_queries.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/record_queries.py new file mode 100644 index 00000000..e8273be9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/record_queries.py @@ -0,0 +1,117 @@ +from __future__ import annotations + +import dataclasses +import inspect +import typing as t +from time import perf_counter + +import sqlalchemy as sa +import sqlalchemy.event as sa_event +from flask import current_app +from flask import g +from flask import has_app_context + + +def get_recorded_queries() -> list[_QueryInfo]: + """Get the list of recorded query information for the current session. Queries are + recorded if the config :data:`.SQLALCHEMY_RECORD_QUERIES` is enabled. + + Each query info object has the following attributes: + + ``statement`` + The string of SQL generated by SQLAlchemy with parameter placeholders. + ``parameters`` + The parameters sent with the SQL statement. + ``start_time`` / ``end_time`` + Timing info about when the query started execution and when the results where + returned. Accuracy and value depends on the operating system. + ``duration`` + The time the query took in seconds. + ``location`` + A string description of where in your application code the query was executed. + This may not be possible to calculate, and the format is not stable. + + .. versionchanged:: 3.0 + Renamed from ``get_debug_queries``. + + .. versionchanged:: 3.0 + The info object is a dataclass instead of a tuple. + + .. versionchanged:: 3.0 + The info object attribute ``context`` is renamed to ``location``. + + .. versionchanged:: 3.0 + Not enabled automatically in debug or testing mode. + """ + return g.get("_sqlalchemy_queries", []) # type: ignore[no-any-return] + + +@dataclasses.dataclass +class _QueryInfo: + """Information about an executed query. Returned by :func:`get_recorded_queries`. + + .. versionchanged:: 3.0 + Renamed from ``_DebugQueryTuple``. + + .. versionchanged:: 3.0 + Changed to a dataclass instead of a tuple. + + .. versionchanged:: 3.0 + ``context`` is renamed to ``location``. + """ + + statement: str | None + parameters: t.Any + start_time: float + end_time: float + location: str + + @property + def duration(self) -> float: + return self.end_time - self.start_time + + +def _listen(engine: sa.engine.Engine) -> None: + sa_event.listen(engine, "before_cursor_execute", _record_start, named=True) + sa_event.listen(engine, "after_cursor_execute", _record_end, named=True) + + +def _record_start(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: + if not has_app_context(): + return + + context._fsa_start_time = perf_counter() # type: ignore[attr-defined] + + +def _record_end(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: + if not has_app_context(): + return + + if "_sqlalchemy_queries" not in g: + g._sqlalchemy_queries = [] + + import_top = current_app.import_name.partition(".")[0] + import_dot = f"{import_top}." + frame = inspect.currentframe() + + while frame: + name = frame.f_globals.get("__name__") + + if name and (name == import_top or name.startswith(import_dot)): + code = frame.f_code + location = f"{code.co_filename}:{frame.f_lineno} ({code.co_name})" + break + + frame = frame.f_back + else: + location = "" + + g._sqlalchemy_queries.append( + _QueryInfo( + statement=context.statement, + parameters=context.parameters, + start_time=context._fsa_start_time, # type: ignore[attr-defined] + end_time=perf_counter(), + location=location, + ) + ) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/session.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/session.py new file mode 100644 index 00000000..631fffa8 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/session.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy as sa +import sqlalchemy.exc as sa_exc +import sqlalchemy.orm as sa_orm +from flask.globals import app_ctx + +if t.TYPE_CHECKING: + from .extension import SQLAlchemy + + +class Session(sa_orm.Session): + """A SQLAlchemy :class:`~sqlalchemy.orm.Session` class that chooses what engine to + use based on the bind key associated with the metadata associated with the thing + being queried. + + To customize ``db.session``, subclass this and pass it as the ``class_`` key in the + ``session_options`` to :class:`.SQLAlchemy`. + + .. versionchanged:: 3.0 + Renamed from ``SignallingSession``. + """ + + def __init__(self, db: SQLAlchemy, **kwargs: t.Any) -> None: + super().__init__(**kwargs) + self._db = db + self._model_changes: dict[object, tuple[t.Any, str]] = {} + + def get_bind( + self, + mapper: t.Any | None = None, + clause: t.Any | None = None, + bind: sa.engine.Engine | sa.engine.Connection | None = None, + **kwargs: t.Any, + ) -> sa.engine.Engine | sa.engine.Connection: + """Select an engine based on the ``bind_key`` of the metadata associated with + the model or table being queried. If no bind key is set, uses the default bind. + + .. versionchanged:: 3.0.3 + Fix finding the bind for a joined inheritance model. + + .. versionchanged:: 3.0 + The implementation more closely matches the base SQLAlchemy implementation. + + .. versionchanged:: 2.1 + Support joining an external transaction. + """ + if bind is not None: + return bind + + engines = self._db.engines + + if mapper is not None: + try: + mapper = sa.inspect(mapper) + except sa_exc.NoInspectionAvailable as e: + if isinstance(mapper, type): + raise sa_orm.exc.UnmappedClassError(mapper) from e + + raise + + engine = _clause_to_engine(mapper.local_table, engines) + + if engine is not None: + return engine + + if clause is not None: + engine = _clause_to_engine(clause, engines) + + if engine is not None: + return engine + + if None in engines: + return engines[None] + + return super().get_bind(mapper=mapper, clause=clause, bind=bind, **kwargs) + + +def _clause_to_engine( + clause: sa.ClauseElement | None, + engines: t.Mapping[str | None, sa.engine.Engine], +) -> sa.engine.Engine | None: + """If the clause is a table, return the engine associated with the table's + metadata's bind key. + """ + table = None + + if clause is not None: + if isinstance(clause, sa.Table): + table = clause + elif isinstance(clause, sa.UpdateBase) and isinstance(clause.table, sa.Table): + table = clause.table + + if table is not None and "bind_key" in table.metadata.info: + key = table.metadata.info["bind_key"] + + if key not in engines: + raise sa_exc.UnboundExecutionError( + f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." + ) + + return engines[key] + + return None + + +def _app_ctx_id() -> int: + """Get the id of the current Flask application context for the session scope.""" + return id(app_ctx._get_current_object()) # type: ignore[attr-defined] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/table.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/table.py new file mode 100644 index 00000000..ab08a692 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/table.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy as sa +import sqlalchemy.sql.schema as sa_sql_schema + + +class _Table(sa.Table): + @t.overload + def __init__( + self, + name: str, + *args: sa_sql_schema.SchemaItem, + bind_key: str | None = None, + **kwargs: t.Any, + ) -> None: + ... + + @t.overload + def __init__( + self, + name: str, + metadata: sa.MetaData, + *args: sa_sql_schema.SchemaItem, + **kwargs: t.Any, + ) -> None: + ... + + @t.overload + def __init__( + self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any + ) -> None: + ... + + def __init__( + self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any + ) -> None: + super().__init__(name, *args, **kwargs) # type: ignore[arg-type] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/track_modifications.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/track_modifications.py new file mode 100644 index 00000000..7028b653 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask_sqlalchemy/track_modifications.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy as sa +import sqlalchemy.event as sa_event +import sqlalchemy.orm as sa_orm +from flask import current_app +from flask import has_app_context +from flask.signals import Namespace # type: ignore[attr-defined] + +if t.TYPE_CHECKING: + from .session import Session + +_signals = Namespace() + +models_committed = _signals.signal("models-committed") +"""This Blinker signal is sent after the session is committed if there were changed +models in the session. + +The sender is the application that emitted the changes. The receiver is passed the +``changes`` argument with a list of tuples in the form ``(instance, operation)``. +The operations are ``"insert"``, ``"update"``, and ``"delete"``. +""" + +before_models_committed = _signals.signal("before-models-committed") +"""This signal works exactly like :data:`models_committed` but is emitted before the +commit takes place. +""" + + +def _listen(session: sa_orm.scoped_session[Session]) -> None: + sa_event.listen(session, "before_flush", _record_ops, named=True) + sa_event.listen(session, "before_commit", _record_ops, named=True) + sa_event.listen(session, "before_commit", _before_commit) + sa_event.listen(session, "after_commit", _after_commit) + sa_event.listen(session, "after_rollback", _after_rollback) + + +def _record_ops(session: Session, **kwargs: t.Any) -> None: + if not has_app_context(): + return + + if not current_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: + return + + for targets, operation in ( + (session.new, "insert"), + (session.dirty, "update"), + (session.deleted, "delete"), + ): + for target in targets: + state = sa.inspect(target) + key = state.identity_key if state.has_identity else id(target) + session._model_changes[key] = (target, operation) + + +def _before_commit(session: Session) -> None: + if not has_app_context(): + return + + app = current_app._get_current_object() # type: ignore[attr-defined] + + if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: + return + + if session._model_changes: + changes = list(session._model_changes.values()) + before_models_committed.send(app, changes=changes) + + +def _after_commit(session: Session) -> None: + if not has_app_context(): + return + + app = current_app._get_current_object() # type: ignore[attr-defined] + + if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: + return + + if session._model_changes: + changes = list(session._model_changes.values()) + models_committed.send(app, changes=changes) + session._model_changes.clear() + + +def _after_rollback(session: Session) -> None: + session._model_changes.clear() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/LICENSE b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/LICENSE new file mode 100644 index 00000000..0dca6e18 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/LICENSE @@ -0,0 +1,23 @@ +2009-2024 (c) Benoît Chesneau +2009-2015 (c) Paul J. Davis + +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/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/METADATA new file mode 100644 index 00000000..550aef24 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/METADATA @@ -0,0 +1,130 @@ +Metadata-Version: 2.1 +Name: gunicorn +Version: 23.0.0 +Summary: WSGI HTTP Server for UNIX +Author-email: Benoit Chesneau +License: MIT +Project-URL: Homepage, https://gunicorn.org +Project-URL: Documentation, https://docs.gunicorn.org +Project-URL: Issue tracker, https://github.com/benoitc/gunicorn/issues +Project-URL: Source code, https://github.com/benoitc/gunicorn +Project-URL: Changelog, https://docs.gunicorn.org/en/stable/news.html +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Other Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: POSIX +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +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 :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet +Classifier: Topic :: Utilities +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: packaging +Requires-Dist: importlib-metadata ; python_version < "3.8" +Provides-Extra: eventlet +Requires-Dist: eventlet !=0.36.0,>=0.24.1 ; extra == 'eventlet' +Provides-Extra: gevent +Requires-Dist: gevent >=1.4.0 ; extra == 'gevent' +Provides-Extra: gthread +Provides-Extra: setproctitle +Requires-Dist: setproctitle ; extra == 'setproctitle' +Provides-Extra: testing +Requires-Dist: gevent ; extra == 'testing' +Requires-Dist: eventlet ; extra == 'testing' +Requires-Dist: coverage ; extra == 'testing' +Requires-Dist: pytest ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Provides-Extra: tornado +Requires-Dist: tornado >=0.2 ; extra == 'tornado' + +Gunicorn +-------- + +.. image:: https://img.shields.io/pypi/v/gunicorn.svg?style=flat + :alt: PyPI version + :target: https://pypi.python.org/pypi/gunicorn + +.. image:: https://img.shields.io/pypi/pyversions/gunicorn.svg + :alt: Supported Python versions + :target: https://pypi.python.org/pypi/gunicorn + +.. image:: https://github.com/benoitc/gunicorn/actions/workflows/tox.yml/badge.svg + :alt: Build Status + :target: https://github.com/benoitc/gunicorn/actions/workflows/tox.yml + +.. image:: https://github.com/benoitc/gunicorn/actions/workflows/lint.yml/badge.svg + :alt: Lint Status + :target: https://github.com/benoitc/gunicorn/actions/workflows/lint.yml + +Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork +worker model ported from Ruby's Unicorn_ project. The Gunicorn server is broadly +compatible with various web frameworks, simply implemented, light on server +resource usage, and fairly speedy. + +Feel free to join us in `#gunicorn`_ on `Libera.chat`_. + +Documentation +------------- + +The documentation is hosted at https://docs.gunicorn.org. + +Installation +------------ + +Gunicorn requires **Python 3.x >= 3.7**. + +Install from PyPI:: + + $ pip install gunicorn + + +Usage +----- + +Basic usage:: + + $ gunicorn [OPTIONS] APP_MODULE + +Where ``APP_MODULE`` is of the pattern ``$(MODULE_NAME):$(VARIABLE_NAME)``. The +module name can be a full dotted path. The variable name refers to a WSGI +callable that should be found in the specified module. + +Example with test app:: + + $ cd examples + $ gunicorn --workers=2 test:app + + +Contributing +------------ + +See `our complete contributor's guide `_ for more details. + + +License +------- + +Gunicorn is released under the MIT License. See the LICENSE_ file for more +details. + +.. _Unicorn: https://bogomips.org/unicorn/ +.. _`#gunicorn`: https://web.libera.chat/?channels=#gunicorn +.. _`Libera.chat`: https://libera.chat/ +.. _LICENSE: https://github.com/benoitc/gunicorn/blob/master/LICENSE diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/RECORD new file mode 100644 index 00000000..ffe25e40 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/RECORD @@ -0,0 +1,77 @@ +../../../bin/gunicorn,sha256=yUPowKuOhinpcLlsJcDXLUdHsxTe4nKKB4nyXSmfec0,261 +gunicorn-23.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +gunicorn-23.0.0.dist-info/LICENSE,sha256=ZkbNu6LpnjQh3RjCIXNXmh_eNH6DHa5q3ugO7-Mx6VE,1136 +gunicorn-23.0.0.dist-info/METADATA,sha256=KhY-mRcAcWCLIbXIHihsUNKWB5fGDOrsbq-JKQTBHY4,4421 +gunicorn-23.0.0.dist-info/RECORD,, +gunicorn-23.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +gunicorn-23.0.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91 +gunicorn-23.0.0.dist-info/entry_points.txt,sha256=bF8VNiG4H8W83JfEBcqcPMydv9hl04CS4kwh1KOYrFY,113 +gunicorn-23.0.0.dist-info/top_level.txt,sha256=cdMaa2yhxb8do-WioY9qRHUCfwf55YztjwQCncaInoE,9 +gunicorn/__init__.py,sha256=NaLW_JTiKLgqMXipjqzxFn-1wdiptlO2WxOB_KKwx94,257 +gunicorn/__main__.py,sha256=tviepyuwKyB6SPV28t2eZy_5PcCpT56z7QZjzbMpkQw,338 +gunicorn/__pycache__/__init__.cpython-312.pyc,, +gunicorn/__pycache__/__main__.cpython-312.pyc,, +gunicorn/__pycache__/arbiter.cpython-312.pyc,, +gunicorn/__pycache__/config.cpython-312.pyc,, +gunicorn/__pycache__/debug.cpython-312.pyc,, +gunicorn/__pycache__/errors.cpython-312.pyc,, +gunicorn/__pycache__/glogging.cpython-312.pyc,, +gunicorn/__pycache__/pidfile.cpython-312.pyc,, +gunicorn/__pycache__/reloader.cpython-312.pyc,, +gunicorn/__pycache__/sock.cpython-312.pyc,, +gunicorn/__pycache__/systemd.cpython-312.pyc,, +gunicorn/__pycache__/util.cpython-312.pyc,, +gunicorn/app/__init__.py,sha256=8m9lIbhRssnbGuBeQUA-vNSNbMeNju9Q_PUnnNfqOYU,105 +gunicorn/app/__pycache__/__init__.cpython-312.pyc,, +gunicorn/app/__pycache__/base.cpython-312.pyc,, +gunicorn/app/__pycache__/pasterapp.cpython-312.pyc,, +gunicorn/app/__pycache__/wsgiapp.cpython-312.pyc,, +gunicorn/app/base.py,sha256=KV2aIO50JTlakHL82q9zu3LhCJrDmUmaViwSy14Gk6U,7370 +gunicorn/app/pasterapp.py,sha256=BIa0mz_J86NuObUw2UIyjLYKUm8V3b034pJrTkvF-sA,2016 +gunicorn/app/wsgiapp.py,sha256=gVBgUc_3uSK0QzXYQ1XbutacEGjf44CgxAaYkgwfucY,1924 +gunicorn/arbiter.py,sha256=xcHpv8bsrYpIpu9q7YK4ue11f9kmz80dr7BUwKX3oxk,21470 +gunicorn/config.py,sha256=t3BChwMoBZwfV05Iy_n3oh232xvi1SORkOJfHFL_c-8,70318 +gunicorn/debug.py,sha256=c8cQv_g3d22JE6A4hv7FNmMhm4wq6iB_E-toorpqJcw,2263 +gunicorn/errors.py,sha256=iLTJQC4SVSRoygIGGHXvEp0d8UdzpeqmMRqUcF0JI14,897 +gunicorn/glogging.py,sha256=76MlUUc82FqdeD3R4qC8NeUHt8vxa3IBSxmeBtbZKtE,15273 +gunicorn/http/__init__.py,sha256=1k_WWvjT9eDDRDOutzXCebvYKm_qzaQA3GuLk0VkbJI,255 +gunicorn/http/__pycache__/__init__.cpython-312.pyc,, +gunicorn/http/__pycache__/body.cpython-312.pyc,, +gunicorn/http/__pycache__/errors.cpython-312.pyc,, +gunicorn/http/__pycache__/message.cpython-312.pyc,, +gunicorn/http/__pycache__/parser.cpython-312.pyc,, +gunicorn/http/__pycache__/unreader.cpython-312.pyc,, +gunicorn/http/__pycache__/wsgi.cpython-312.pyc,, +gunicorn/http/body.py,sha256=sQgp_hJUjx8DK6LYzklMTl-xKcX8efsbreCKzowCGmo,7600 +gunicorn/http/errors.py,sha256=6tcG9pCvRiooXpfudQBILzUPx3ertuQ5utjZeUNMUqA,3437 +gunicorn/http/message.py,sha256=ok4xnqWhntIn21gcPa1KYZWRYTbwsECpot-Eac47qFs,17632 +gunicorn/http/parser.py,sha256=wayoAFjQYERSwE4YGwI2AYSNGZ2eTNbGUtoqqQFph5U,1334 +gunicorn/http/unreader.py,sha256=D7bluz62A1aLZQ9XbpX0-nDBal9KPtp_pjokk2YNY8E,1913 +gunicorn/http/wsgi.py,sha256=x-zTT7gvRF4wipmvoVePz1qO407JZCU_sNU8yjcl_R4,12811 +gunicorn/instrument/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +gunicorn/instrument/__pycache__/__init__.cpython-312.pyc,, +gunicorn/instrument/__pycache__/statsd.cpython-312.pyc,, +gunicorn/instrument/statsd.py,sha256=ghmaniNEjMMLvvdQkDPpB_u9a8z4FBfWUE_C9O1KIYQ,4750 +gunicorn/pidfile.py,sha256=HntiveG8eJmwB8_D3o5cBXRuGKnC0cvWxg90MWh1hUc,2327 +gunicorn/reloader.py,sha256=oDuK2PWGyIMm0_vc1y196Z1EggOvBi-Iz_2UbRY7PsQ,3761 +gunicorn/sock.py,sha256=VVF2eeoxQEJ2OEoZoek3BFZTqj7wXvQql7jpdFAjVTI,6834 +gunicorn/systemd.py,sha256=DmWbcqeRyHdAIy70UCEg2J93v6PpESp3EFTNm0Djgyg,2498 +gunicorn/util.py,sha256=YqC4E3RxhFNH-W4LOqy1RtxcHRy9hRyYND92ZSNXEwc,19095 +gunicorn/workers/__init__.py,sha256=Y0Z6WhXKY6PuTbFkOkeEBzIfhDDg5FeqVg8aJp6lIZA,572 +gunicorn/workers/__pycache__/__init__.cpython-312.pyc,, +gunicorn/workers/__pycache__/base.cpython-312.pyc,, +gunicorn/workers/__pycache__/base_async.cpython-312.pyc,, +gunicorn/workers/__pycache__/geventlet.cpython-312.pyc,, +gunicorn/workers/__pycache__/ggevent.cpython-312.pyc,, +gunicorn/workers/__pycache__/gthread.cpython-312.pyc,, +gunicorn/workers/__pycache__/gtornado.cpython-312.pyc,, +gunicorn/workers/__pycache__/sync.cpython-312.pyc,, +gunicorn/workers/__pycache__/workertmp.cpython-312.pyc,, +gunicorn/workers/base.py,sha256=eM9MTLP9PdWL0Pm5V5byyBli-r8zF2MSEGjefr3y92M,9763 +gunicorn/workers/base_async.py,sha256=Oc-rSV81uHqvEqww2PM6tz75qNR07ChuqM6IkTOpzlk,5627 +gunicorn/workers/geventlet.py,sha256=s_I-gKYgDJnlAHdCxN_wfglODnDE1eJaZJZCJyNYg-4,6069 +gunicorn/workers/ggevent.py,sha256=OEhj-bFVBGQ-jbjr5S3gSvixJTa-YOQYht7fYTOCyt4,6030 +gunicorn/workers/gthread.py,sha256=moycCQoJS602u3U7gZEooYxqRP86Tq5bmQnipL4a4_c,12500 +gunicorn/workers/gtornado.py,sha256=zCHbxs5JeE9rtZa5mXlhftBlNlwp_tBWXuTQwqgv1so,5811 +gunicorn/workers/sync.py,sha256=mOY84VHbAx62lmo2DLuifkK9d6anEgvC7LAuYVJyRM4,7204 +gunicorn/workers/workertmp.py,sha256=bswGosCIDb_wBfdGaFqHopgxbmJ6rgVXYlVhJDWZKIc,1604 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/WHEEL new file mode 100644 index 00000000..1a9c5358 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (72.1.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt new file mode 100644 index 00000000..fd14749b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +gunicorn = gunicorn.app.wsgiapp:run + +[paste.server_runner] +main = gunicorn.app.pasterapp:serve diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/top_level.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/top_level.txt new file mode 100644 index 00000000..8f22dccf --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +gunicorn diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__init__.py new file mode 100644 index 00000000..cdcd1352 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__init__.py @@ -0,0 +1,8 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +version_info = (23, 0, 0) +__version__ = ".".join([str(v) for v in version_info]) +SERVER = "gunicorn" +SERVER_SOFTWARE = "%s/%s" % (SERVER, __version__) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__main__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__main__.py new file mode 100644 index 00000000..ceb44d08 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__main__.py @@ -0,0 +1,10 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +from gunicorn.app.wsgiapp import run + +if __name__ == "__main__": + # see config.py - argparse defaults to basename(argv[0]) == "__main__.py" + # todo: let runpy.run_module take care of argv[0] rewriting + run(prog="gunicorn") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e1cab0603c4c446d9a865fe12c5ce6cec122206 GIT binary patch literal 455 zcmX@j%ge<81h$WPG8h>d7#@Q-Fu(z2e9i+hrZc24L@}f=W--I05p*hp3qwCcGE+Jb z#{$i(Wnf}RWvXFV4Kxu1CNlN#umI(1;UZDYDNIo;sVuV@Q75~RNfWalqNy;~gVrFogj`9*oZ81?-$*>3Tar4|)u=I6y{=B4G| zV#&(S%)7;0TvBw4J3byJ6@QB@*fl83HRu*UgpLpPcMA!3406?Eyv0~n405BvuXz2? zVxU?2so9Bn#Ti+dc`1oG`ktO4zWTn7E{6JrrI}T^iNz(UMfzo_d1d-JnMwKul_eSZ zdB%E%M*78>C8@dviOJcC>8Zu~Fh}ag1KpKb5+AQuQ2C3)CO1E&G$+-rh#zPn$kJk4 zAn}2jk&*EO7lVLQ1J4aU!TyZSj1@fB#7!3%&Sak9IG62`xanm+vj*-PoWc!kw`7$U ZMqdyzY~=s>iIqXZte6F8!X$np4gd@;c)S1r literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/__main__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5760621d79d610ba3d9967fffac28fd4e3375b2 GIT binary patch literal 336 zcmXv~y-ve05I)yQi9)+E02>1m8HiO_0SSqvLm3b(T`W^uscGT_yD3Vapl`r4Ab1lt z28K*Xo!E*hmQL6b`G)(|ci-K;ce^22oG&}$8w9X)Ndx>JtYaHI0|$;$$j}fW5G~%C z90BOC1p;yW=Dk|B1A@x0{HXoyk_gpUm#PjZ&6re_)rRNb9wecTB}HLFo&u-NX$gcSdMK#Dpm`evpc@l=SXFA%&NF7FLX(+L zGm^@CQdHA%u1@3L2{Cdijte%LutXTr$dYEgxTrS4S(fuM6&Jc=_1snFz?v0C2>phD c4!`jBV*Y{me%jy%i{YoYyV?S8U%N;C0kQ2|;{X5v literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/arbiter.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/arbiter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d776c19f09b97f0e7f767b73e7e576283c3850d0 GIT binary patch literal 33405 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 O(uIRpzrkJzc>Dnnt_ke` literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/glogging.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/glogging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6346483cd866ac83e2f679d75ae615da58a49a01 GIT binary patch literal 22078 zcmch9Ygk;zmEgVoe$fxQc{I(V#k<8zfF1~8$p{dVg&+pxL_~6@)we;7p&Q?O(WBEi zvOmuRY|RQ{&w$p-3MI}8jXf)QH@mTSX200+?0RN0^L?}$r#sio_vxF-e&6UHdTin- zyE}VM-M+VhG_rTIlM*^rx9ZfX_o-8-PW4Z-vJ4csr~c7&=H@<%`bYeb97%zXhyRJD zsCkN^7;_ax2GlhArtYlhO&rn9x@Z(GGqZ?J!T!Z4cTZaNHH2l`v%SE7(GA( zV+3eovH+SH3qUJF0kkpM0PTzeU=EWDFpuQQXPgi&U=#pdOd-G`rWjxe;|92mDFs-@ zlmo0_Dw!&#n(rG^{|s+(e-ewAX{13B*~#hx3= zWe!4G9!cwfw9a=FsTB1E+S7FpKYH)M2vQzeFfc(s-w_TC2S@O0I5-xNzf_Zaa7RDdq%FgU>m&)&n)6jXjT9J;5+poZ}U#^D3&ASj3ViF-zZ@j`$N3Cghv_MV1( zkNbjS_pmyGDik=!-NVrqbX>qc$p-lgf`+@mjfF?~4V`0B< zY{xxo`lIolE&b7SFFXCwe9sOa_Z$dv5ac4r1K?4mDD6!7yHft{l)vYYpgPifs87)P z!yzs_7Vszp^;qC+U`)`R@r9VN0Luwk0hSH3-W0~*WAn&lDCiHfp?Z?wQL#IqEVdDV zpr2sF6TT529}sjePWr||zVX0gi=4sd_Xjx6qhOmc$8G?T9O#9SU}&U%fM)}~@xx-N zf_5Yj3a~+c#2Pryw>C6Dchz$|6Q1NfNlG*JD#q(7 z7y$f<};s`??R9#A)pSSdlvKqm~3^K1*0?9m9?v(T5pa7f5!f}HR4 zSil=NALMvwxfjV`N2}Oym>0CEPq9M{avM265Rx5EGMs`B{}#YJ#mfn!sU;vsKwygE zah?$urA9IDCO3-HZj&3uiM`3allp!K7ZtcEI!bp^mlb}+2<2Ctf=M@};8SUt*cKTg6TV>tD}=Lq;sSdR3L@ZZ5a7B2T%>+s%)Z<<({{0Q)ncFRobQ?INjPd^ zj+%sHN6fJ!?r4fznlBzs?r8a$aqp7qQg^~s6f+eqFrS*r?ilwjtM>jHJPrr+BSm5R zHr0kXBF%({<&geum?Z%Uw=USWXkeSlX=<2e6tC)rRMXUXdPqG$!SvM+_=W@Re0ZGm zOW7eah0}*jw;w`a!*s*gO)g4FLrhaqdQ_fzX*6jXbyBB*cbtThrW8|3UfvO-N?x9j z5>IDyqsmNEl7U7@I8iF9XoF%d)kc+axJgA_fTs06rb{D=lclg0Rk#%hI$8y3_)>={7`Q%g{v^^HviINUB^ z`ncI+5MT!YM6%^Rte1-LK|I$B;3BoEGhNP_$(m(WbgpDU$+em*HE-2Dpj7(OnP;Xu zW^-08&V`D%?JJgwWZ|}J$F3Y(DqEV27w(!>%?^A=f46X(7`U&891npatQ&+Whr>Yz z>Q5l>$Mif7fV>_hBnreCX^7Zzz{oI&(hyB4qKYVWmSQbDHkG&;=-fZbqM)-SDg)F7 zMU>tWPc9Ad$WVOqF|M3z&+UoXD;Hmk+da!B&s}>i zdlKlvjDop@%mn6=!Rs9lGn2sIy@JW>l{P`Im&^?ot0-ip8sHC%jX~>Zb{K1i!}PS+ zkUj{q2)vkpd;RCHQV&!bb?L9H26f&V1%MPyko@Zh7zc?=fI)yT{L~i=|8WMHIF)G% zfJ~>9Ru-^zc^#*Rol(6|4K*!_Dj2mB3Z8-~!6-4rXh@2cmp7YCTMTX=Ta+zN8Ij&F zY!X|vMJr80wqgrfGKNSCw!^01Ud$LJ;cuYl}M zmeY2|Nc_qz+Gdn;h$FzjS)_m(wMZ1xzPzASp#zMG&@9`6rfDP1FQAqmrI;)-+DgVe zr3zVr>J!V~qSSOtEaF^B)$+g=_@?yiO!c)osvbotd6Sb`&Y9Qsv^A=Zz$}nj`U=gX z6ir-IEyYf$Lkh+=rH0)^6;%%_a29&9dm~zqfX{E{WG{oaRuuR za_&%=cl+F8=7})NyF-)Xrvq$#Pyyw64D2^Zsoca^kcaa}AOx~-*#AO+7YqY^9Y?*L z-Tm#y1S1I#4EA@yhpB%ughFr^%JnR6O@cPaF~Jd}5Df9SLt^~|JyP=W7bXINdII@0 z9AF@ZM5wT$f(mOyCU9ZG5hSy z`Gq}qETyZ3rHR72SYh3){;t)zu=85$mDa^z+_mGjE#_)ow(MNi?Yyfsl48!UXx&MR z{c>a`vQQnjlr6T$ES1x$Rl74`FOS*FXLLz@*5#6!l7;*ged$)16)}6ojP4iaf@N28 z+$_>JOfxTkbCz3R=DsOqD|`K03ophj+ZMMimM&W=5|)~nr6z8vn^7h8xS6;%BPJ|W zF-uk4;z5k8+3eQ}l9qxQ)m^c|uScgi>nV(1W?fyqH^1_cPjn&ndD0L0>{cavl2tLhKlLauJF#~im z7Jvne6`+f;0W4&)0TwZKfW?dhUS zcC8l(QyrNW_@b0oPG>;08L?p8?$lL&m=c7$_WD z5i0$|BOvYu_{j-SQ=o*)z5#&4;n{GYu!s{&K27`xvCaX2(}dHVaBhz|w=dW1i#yw< zRhP`kvg&EoW%G=AMdw~E*p?`$i51i=*FF_5*bm8;WVr{DEi;xC-L_=0ds>C(kdkfa z7bf#ufMQy86wUX}^~N2*M=t4;_FV9ENjSF{W(>2CX^zm;zhIp*^zxUh6ZAw)y0uaWVl&L)%>B=!qMEqTS}BzFfl__?OA0|O zYH>F?si!23JJIJfZ9;<2mj}13b%xCxYMp_`7uFgX@Fpj%%qP!Va0gdvU|vA6%Qdt17rE zqK_C3Plgyzvta1y>-P3^J=fJUASglCD(C>4+@le-f+$GiZo|Hgg~RnH--EY{>?Mpt zVOKEweG~j78}P!_-ozwOAW}7u0Tn#l-@wHlUiuLqQUvwz*d%vGP=zM~A@(v7P=w*; zjG3Hhf~z-ZQ78;*S18Au62k?(d^;ye^VlQE-UPka8CaMk*kc+V7z8^Zl2Tzvv<#_l zz!J7e_jqi839^d*GajWmEV+6}H1AV=n0e_g0=*g9ZyUQSp>TFgGG(EcX(S%GSK_j+F zPzKKX1!Jm#NSb{M>!2LxMmRhWph5_psMCHEVj`vo9k+UJ_9SZe$7=V-YoGqhs!wV^s*UIO!6_sQPa$x$N$5&qx{^iJjjZcg zE4q4&g%eFe=Z@*zZ|B`8yj}>gpiVMbFSpFJB#fnZjHQd*jp+60ZSGE0>uN#Kwe457 zzwN&UvNK;d=ObvQ(482C}oy;&4e^sUuz`<%44Q-Bw(I1 zFDe%YZ+NeJZ;w1uDgaMIIr0+rmOJ(qKuB1tW7cZW)Xn$J^(_u8mEUT(+3D%qHC)ndDRZsy$Omu6mC@F$9Q#EN&USQ^(9MqA@*Y2^*ib zj#y(yytXr5+BJJL=_r^#Hg{~XX2nsz>L^|~`>CUHO;1^y)(W7M%covDwSnrj@hjsi zmfBU<_Jpe;=4yz$8fSIMs_i$Xu20SC77Ak4^3}468+)$rxpCn7f!obLdg{HW;$`iS zlpC|Uu?5Z7p1ShX?Uv-uy}wk_wtdiDd3$G-tGT6%%}e%MMK_CLWxM0KdzP(x*6fto z_4%V3DyMAKQ392NGxnNZ?Jz%}G+A|zOjKUk+s%vI_gmt*waeDp->hXp^lu&&Q#sCr zqdMlOUUihFGa5Dd*$*hKt?`kWa#g*}Ej54te7s=CvSY_@)+`YHm}`W!_0uNfvl{B} zbnU8V_fav8^Vt?EGDrU&<()lh2yaj?;o3(v{=-fH^OORG zVF+z@nd}Xs^aveQe2@M!O^}Kz-=_Z+jiTXAx);Zs} zZy5Ut)I(|-?y~G(0oc?EjF;IT>||lq3{80GhG=X;q11%Jn67YPU|H9+xbu##X=!&{ z*Yx{t!ndJLnVNv{5p#-zrxcoCa+V&4VyO|uFpHlPkU`N$yYZIx1*&Mju)vn8s3a&Q*k}iV53|0ll^bCW_s2Pn! z5zJV%j0T_%ri$^mDW_E%=V=Zs)CjH~aODg8bRKE405wBY$r$kv@fMigLO5$(*er&> zs|Gwv6rpvCddk<~fMeSNCtEs>0*-wP9LGAGoGoz7>u_>;`SL!BX2G;{2xsU?`aI3% zfOY zETvEc0+7?aMb2%QlLwne(PgH=Y>U9ml6oXXu{1Nq%oK(dsMKJ}c$_-KWm51<^N-+` zUse2op3?9|QVuZ7sgPzpn*~b#Vksr(-ieW>oT-meV8&U6aeK+OGgQ+lQffR6$|u&vxJ6xzTh_(%JJdy!vb`n!dk#hj z>~J%LJ=-JI?(P83xrqg&8?2IvVkl*uj25m2vdsYK6-{DrLl)>Wg0a8rSl?imx4pBo zpD3mTdQ6}v1)3LVRxtN>J$t-sV9OJ0nM6e8W^*`6u@BK=D z-(X)yUynd@0zEF!#|8aY+6NDNiRC)|qF@3F{U^L&-EyS2Tc8gM^l7x$3_$@01$tO8 z9UdI~inqV(P*;Cfzd-v03yC-m4S$`%rw>}7#>ayH1lv$VTfx*rZ}ShW(7AD6uq$M1w3|CR{8izZrvu%12);j!FUn$ zWL{$MuMCCHp`kk<^DO&M*k4+BAP^2QoM0Lc!kdHC7yC`jeghFSfIbmqpdLPsWP6B7 zSQ+*|B0w3zV-n>76<8Qe2ue2aqM!wnzFT|D_+#bZPj;d4NDzsT1?T2Dfx5xZxpQQF~$Hf3+I-r_QXqCk|mXk z7vd$2;4fFT+$q_+rdDL{TQee_6?5jU*)W`qVN!wRqPn=Pe$9@t4moz=>v5ZBEe9iW z(~-}|ZMAE87@03eE*I6uZ4GNqj4goJH}e)83uhO3K)v0$Y-_n=JNg#`A38p9e&qb~ z=kM71|B734A#UMD+_fT%ESAYGJijy$w>7SnV6WpKuKS_=_Q}Mq-q^0*TPUZnw{lEYdf$*R|i*$8tR|WpZodIbAEdLwECB^U=BJv}qMcwJqkY7(Gc>Rl-#l zbJfLN4bwd^XY^)5tT2&tXlr7JR&?EfTU3rl*l+bM>zqlk63cs^N#q>eI^)q5UC&*M zW7_oVhb}7j5dG_iW-7NEJROzWLlbk}Puhx)>I{EfP<+&E_#1ceQHQ}V%T%y>bnqW# z;fDplMYlAkkdHionQ~ls3oT8CgAjLO3tZTDH#@Fl3tX(}Cdbunfh!-Q(iy<0KeJW| zIm;%;(ihNJSe8!H$q;Kxe@P)cVxi%tbXociFd=kPYCY<*vc<3Ua1_lrH@Pk9m%9lK zKEZ4>H6ozx!s{T}AOkLRDv7Cw>$h{IC6-JwnIsEIb*HHlKwG+U@+cxF-2;Ju`wY*c zl_`2my$_zDoC(y2*^ve&?B^Pq>UT82QID%X!;g=Z`NQLq*&9xJ(|VgC&3&3=gB-y`_X2v8bj-vc1n36J-lV|^1~xi8x0lU+r;=0S~%U`t(& zKt;S_X@b5>Rvw^o46LMBcx!PQ-q677Jo2Ino=EvU8u9w!e`0a}3&Ht_;`Eq5wgl3-?; zzB5QAJawn?DbST)K0I^ya^Guxi=8(PUq75E@4Zvr3kq(amRpd>se^3`k)D}(223gk z7OR%p;-;2|N=2?=8ulZlz5!GFX8IB)cg*Boblk|lo}bvZFSc#p`$M0a4u8IC$%mT= z5e~v8%Szp!`cc4RFH~0OTBmd(=W; zy_zJGt~PBL2&T=7h{w%>JsKNw9C7_LsuOf47f zid%MrLP%5trPeNBP!#ef(mt?7`oH3ivoyOEAIrcWMZ+q{<9YIPfpw`FIGk)+1y3EG zq&E;vtAN{NP$2CR4aG8?v|lcO92w$A?WCtR0Ew5t`CaC7TX45by|Lb?OXm9N)9o znn19B0wsC!#64^g!t8Yf-$U?y1aBkw0fO%!xC{Uv7sI)W{kIr_M=o{=!A%4Q5i}wo z>e(&`3C2TUbZ}UDwe0i5J5e?u-jl1nXr+L!2*(0G4qg$8J6S6dKt(Jb;>0)BxZdRR z6CS%TBQen6BKFiCwmy_bzuUax;=>cskbbbiCoh31(C%du_YqcBpU3p(ZL1X>CE6s9P#nZ5gaVJPgia=X- zkP0^48z0&|nICRgCy#Q^RJ0({)=#>wJlzd7&EO!)(ZX3;*F$e@Py+bWRd0U4TnIO4EV)$YzGv04*oSr zCkv4!cYr8T$T|$XQj0iJOK$^-8A##21-Ni!VlTk?soO9=wO=$pRr35?Ep#Ue>tluW zOXqIAbn~S|Luag^Gv07$rLcS5B((s=`${O}bI?qzo0vE(AL;iV%v1d&FZ-ZJyW!qX zo{NV8YpWXLGD69;-?d`_MEhP}fUg}41QH9+Ag!OLCLU!{Kj0c^%ZX80?} zx}iJqdQN&*PgFue4$*o^IVIbyNMWjjGp4?Y9bE~efXUe$^M!MT4=9D+Io-Z$$(?<1 zp=NRNQ%hYkFaJBb`)Y_Ma$@g>V>BMAu_+H90V#5f27j|lzXbuyPBrVwyf`zxVo$#l zgu|WU&P zyfI6q6Km%T$J#9fyG)n`XP#;S(pPM7y{3q&y|OS1<4`71N&D;j`~ndc z_(CZaj@e2S8ZPaYm<3E&qH-SeWV3khEdHj3hJ{~nfuG|b`*+rc-yLBI&#=My86G|c zIXKe>c~o_ZtOdmZkPptlc||athAkcUeqt#12BfekoeJs^HarP>;=TdVOwRIXzx`SvsNyiU9o~S6_}KvwcC;=?r4~$*HmhobJdYMe|YZj!n4<&zw-Rj z;H|IS{2K1EV6S%ggTp`W{h)WnaTF}gvdouzXL=W!S4<_zg5v4+OGmLP7}fZxsc3B* zWh(ysQ8txd@_ocA?g^0cOf&|?mm6ZO%ac6~<;^>K~9V~_IV-88_=Yy4->dRXI% zQOLB}!9`>tuF*`}Zl;yJ{z`dD%_yU4xXM*TRd3PXRlzlNdL8OEmxO8{z=g|az?CiI zrp@#u-zXSPzlyWDQ*4V82VPe6|ecE8z!hIfURLcUl}F+=Os}9wem^ zYsz{s2eyKZA|T8GCl%oh1c>)9w;(Q3AZ@K^3!SP<>bUV9(BXa#NWdp-j)bi=W-Gm8 z>jF!U@$2J>%6+lQeeZXCXpdKR&1n9iqUPq{vaM-a^GHKkaueo~n7QOnpL=g$*}XSz zZk<-HX_Wew)x7E@d&1Ke^Ry*A2Vg!Qy<%NI;wx$vXO`d{{S6< zKkf$4-oD^hQt+V+`xcx(Q<4#Mp6sMWnvs#nzmUR4A-BvpnOG25*{svIpTJR6zof>p#8CQS z20VxmvdN8a`*FBq?msfrK6s?BS5U(a4wtNd4^>Y8h(km@$q(1HJj5PpCBNtpQ6C>X zRM!%5c7!L#m{1i@ew_+0aFNxtx+^%3Wu1N2H;^2UU=o0!K`~+XPCg@Ze`}2ith3Z-X8=sTB*_G19Qr4|1l5GkAF$v4qIMTU@oB#^W%cKGc8I87g&JG$)N8F%cO*8kk- zSa4n|xl$5$ZcjLO#hkltkE}TNC+&sv2j&idsWTn7Z=Z&rup+-Ju+aY6OKS?Pt(}I2 z4nNP}s)@O3mO5|SZg$@~cJtUfeTmwGvD$+l?upkPjk|hgJMX$m$j>$~OYL!2{nCpu zS7XA}5_7e@pBHzv&vpVUusWuV)BLpY^G9mRS^9R%js4g6uQYcp=N$rlIh2Hoif87Y zSuSaPza!yzdfD+bw!`?FH8rND&hWYI&V$X=PnwH6>XjecvO7G=k3DJ#izmu5b_9Fv z41yp6A|2{F`hoFxwD-Vx^!NAm3)-)?_xFOC0WrZ7)SX=ik9UhEdjAG9y^CN!f`5nL zHiA9`YUpC|7l7Wx&p$x$hX}rn0JH)W8CEuip*VsQ2o@0h5&@W9Q7kd^B!Vmofh;n5 z7KikvX!$9!|5q^)Ks zgjg+xb)deQ_JOSfgbkG1Fx>?93=lSnI9V7rV|?S91;bV`-iG09F>J@MgHl^S#LvNS zu1GTv!}%hP6T<~!*oEOj#5oOy2@oz8!zCDYi{Wh;E)~ON7%rzQwxroA{((h6j$)az ztu;|rThd*T%q?8nyHpc1?S{7H7ABq5%lV$9vnZKgeP6G3p>+nvmM$1cqz57k4fkzk zs|L!*t%H1HJsP(rgI*(9yBsH)}ljA4u!lbPYi zmT97BA7GUVP#+9URH&4;8>LeF(!LY=P^m9TNVLv`he-R>H!nn`N?v--jK>B-cXKVD zd+)jToO|xQ=X~eRzbY!q2$b{Rx`qQzLcYb0RoFsf>o_#BL?8l{AcJO24N^v*9;9h< zfe7@ML|`7#ro`gStg|lovjXNWQj;n%OEXKgA8gIWCaE&C$K4Ewcy&de)(k z6nRJu1Zka%q3JpU#zBu&#Y9Z8gMf;e7#LqAhRMGc7~5m_CMOR^A2g!=n$Tn=6C z?(GcS9GB9g5wJ%IO^EVDC?S0j8cS)zN%>?)=ZTOiX=3|WBsv18r-p{cWht6eNt&d|!K46UJrQR0^OSq!MH*&{~?QK%I7<20k;$rvTWWN28$Vf9OO zj820!j|%JGp^Qu5tZ}V)U2&JiE7fs#scp6PU&Yct&1P7o{Rgz-LGCFT*3zIJDD6t1 zGwg2bwMt7cUS+jPb%y;jW9j(?>};Bww(U68>e5WBm4SGJ9T_-a@yr_6jo0qxVNc+! z6|9J-@P79>d8KK`+I8=1%GmaoE9sT(I44~6h8_A2?xU}08AW!?Y}jY!zV-^X(#k0k zv=5|DcPAk3g%q!h%d!#evVl0QDt{!Y@DMg86tuOfZHP9i7D9@Z5EFETRqTcF<*j2Pdh})E$UQ7}vVJ08u(OsQ?1#Hc^fy1*jF# z6o@90s;G0(;nAcJv@4Jdh^g6T;-t=uszW*(L$!2FFcArZ4`CIGf)1qH%>AVgSjb`a z{V=Bf2MFMX*PlJKaOgLUGq#uI-kjTi-?v=5RC}-fnY$(Dsm}TOXL>e#4U6hZ>}%mK z@rUsztzAzWyViZ@p197vuB-;oalEk+k8f^rc5?34?5#y@IlYu#cORW$UzWS?)64cH z`*Oun#ftE}<``&t(s=Qor=B)mS@&Ii;<~y~b?}?2mZw!MUspY^>X>!T&@+7-jD(_Ze7~J= z*mR0MOgf25O@bAl6AFHJyQY}W$s~1{Xa_9aEkt2(JVj3ub2P}L-Mkv5z z!FhI@fuTGEW!1cvom!ZB=5E~Z__EFg=VHt9(WRp=Jgs?#c=&BQ&O<%#-joqf?Ixj| z-j^;W)!s8czCEj%c z{!vV&;2-7aAA4t|D9c~=cvEzm$uM#BhCM}~F_UXPi@o3D!SH+!T7@f4GrwZ?v+o1- z@AK3!^jBEA-`~@n!m5)ycDFl*Qq;aNbnJt7U1ROPR2x=tmQ^Y0eJda)+xedt(y_Ke*%A2i(Ct^Q z8%bSfBg&AfbE2ZiNuBGv+IQ_TRM)TdT-0rS16TS6ZUk8qs)L5~B)$tMQN=eBM7NoV z6@0gr9`M#%;$z^d4hWvxDi~H_P1Mvhl3FGwT+@86K*@^kcZ0dgB@~2CmK64-0fLDgg z`z~*X@we(9;6 JtxTns;7QNkAJ?22pDGE8K z8RVRG_Ox)1sivMr?r}4P?ZYhaAGe|G<4zvK2!`E6kte1tu@K761VA~ZA-yDx53M2M# zSV%_0VFiImX+nY-+`xOoD;^RfC7a0|okl@|&o`9^@+J9>W;w^Ei{@%J9RaR+^8~{+ zY?e7W?^bny^O?dZ0&aL5Dl_+BxEqR;bJ)TckFmmA$4922A1glr9^$r&FL%IvirOlJ VWbleOUlI4V?Gi=#HVINg`hQ~8NRR*k literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/reloader.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/reloader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..990903fc9571d2505d11a2549faf95d259de06f3 GIT binary patch literal 6392 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/sock.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/__pycache__/sock.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d825dd64b1b42296de2a2bb89bf55f4a8644e61 GIT binary patch literal 11966 zcmbtaYitzRm9FZp>aKp+?MK_#*g(VBKm)ch5A#^?U}GCR12%)rFqkl%##Of4G~MP_ z8L-nm@{U-IJtB+QNraI`!f0m~5JhiGIk&p1+MWhwvsbEntM04r<2=4|?)_O_o|A!a@Yn8vzgx{Pzs3(e@R^szAHmBl zMr1@b%=Bm}+r!dtOOJ)7)*dTOxgL(Dd=F1kTaOJ=OW1x<=n+`P!W>~l>orE?9$K{C zdmJ>6hdi6)cxcV!I%%#Qas|n0}7KrX^Y)`&eDCR-x5%VFp zK=eRdIKujiev4gq_*s=3Rzl%k?MGUi84I(x3%+kL5`(jYnF*o=da~k(VO|`>yyy^l z$g_zy__B*I!X5#7cdE|jpe%JodoM^zN3Xtg*gd}Ev=&dW*m=wvV*;2@L(BqSke~Tt z;Y%M36XV9}6}w(GXw%=!G{y`H=9m7a7&Qm!=IZ%csxN$;7umQi(w6lH_wt(f732P- ze`K~X&MO|h&%pxy%}it5!_3@SAdTfYVW_x7S#|l!0huXKnqCIyt0BHABJP3&DO#uInF;gnFYSQisE-9U4)EKp+$eDS^Ofu}ONh zdS(%ha-Y+RZMIm(LFaaE~%0+?~B^lfMG6Q!70-1_1_|j#AH}b2XzKmoz z#>{z2CzV?xH%F$cW;~k`!X|Cx*(+)YrStF~5K8QzF?Q%86BJ_(gE-R_A*<97IA#@* z)ulGe#45R6P+i!3DTG9L17z;3`iuT1kZ=1ZhxWbggoSIkii7ClIra0JQhHy-P&#T z(bUp%lFDJ#Nu*&}3JgVwqS^<7GUcgiY-sQ7Y9%B}R9+$^5>;KT9i1mmc6N7mp6FI> zt?eCeHXT#B^B|h3)IT4FzlI|HWFt1Vg+m~nBdYy8NMTScevWdeDeYA&^eQ8Bpv0$A zhTuXjW6~^TvI)xM=MaIE5!^RC6P^!ksWN}E%>Sq%wY4$1wed&ntk9fx7u;x{XivF) zpSyi?-ii;~raNZ6JLfH2-s*IL_m=0T=ObInSD*CNf7+1R*_Pbd_EUDY;I%IVrl2I# zcv8IH3I9k5Wl5oIs&H1QSh6wh;>lf!@-4HjtxyZPPr7~6-dXp?=P(%8gln?pR{PEN zl(#zRt)3M&rai^ut}mC$8E?e`V}V~6m)_cUbKgg&Qq>K~>W0twAG&|wPE@rfi(5fo zELjV=d_J+OgJX1Zq?kZc_#QY z;h8NSQN`0C{|CIlkaH@qF?NIjVU@G&Wy%eZ5VSH8;s~;^A%1~{8{()kbBNqQL?bJL z$SSxPG?)TR7pJVovg|tmcbESY7#MQ17#Ni88p=q%D+8ckeF&6*Pkg%mmHjr2EehdZ zWE(~l9C4vYUsSb%j@8v0yG*wctUp?iwH*|KHA1c&gb4P-<+-tMVqd~lnRXY=b5_S; zHbde!Iwv}3-D~CrrlcIf#+OTWreM_q!)B@gKDlvx;&@{9zRz|(x%3YWDR*(i|~yi$sKz_$4v2(?fr2Lh@y5V#l>hr{^p z4g@X@2g6zkL4qeJ+Q|ltkd`!J#0frNC>3b}0(CFJ2nDn3gXkKw$mQ{S7uK@;js+Xb zZ(g(&@!o~aEWduy=HSb<#@M769wQ(PVpzo0dJia3H(VrZF1rAX7Z%JFn`j+p`dBb+ z96k1N<|^AG0GQ%bNB7|qT_F7=Wf@+>zfxi!hnE)-doHv?tYBcU5eoo&Bv^xlp_@z? zG>jWPhhcP#7q^Jk7#p*Q9I9eSc})AP8SH24Q27Bx83K5Y$*8kh-d|S-QME|53aNtH zAg&RmtG19FkmWF?Pt^s835gcB&2QBZmrd>+kS4XFkH`vN*PM<(pf?

7+8B5FYEec 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 vi!=;6$}Rv+6czs(OkkrV?InH9|0r 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¥0H^_ z`5+I!$6)8(H!6(0^Lif7Z@*zV$@8_>2Mi+Lc->{>5A!$j%>4T6UK^ixz08J6!gF6Q zv+^5m!1G)$5%`K54xVr3Z>vrKqu<_m8cOkj`%gl;SMV0hninOZBj_l?%pdhUY)Q|lh?=N0zWEyB+? a^W@iCTJIBnzMCh1kL93Q_=Smw|GxoX7c;j2 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__init__.py new file mode 100644 index 00000000..530e35ca --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__init__.py @@ -0,0 +1,3 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fcee30d8f775c362ee210174180c5403cd89063 GIT binary patch literal 196 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 Uc#o6pdnUGGyy<@!{H2xuA6tt1h5!Hn literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38c1362bb562a238cfcd5c9dc1ad20037169c816 GIT binary patch literal 3085 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 0: + self.cfg.set("default_proc_name", args[0]) + self.app_uri = args[0] + + def load_config(self): + super().load_config() + + if self.app_uri is None: + if self.cfg.wsgi_app is not None: + self.app_uri = self.cfg.wsgi_app + else: + raise ConfigError("No application module specified.") + + def load_wsgiapp(self): + return util.import_app(self.app_uri) + + def load_pasteapp(self): + from .pasterapp import get_wsgi_app + return get_wsgi_app(self.app_uri, defaults=self.cfg.paste_global_conf) + + def load(self): + if self.cfg.paste is not None: + return self.load_pasteapp() + else: + return self.load_wsgiapp() + + +def run(prog=None): + """\ + The ``gunicorn`` command line runner for launching Gunicorn with + generic WSGI applications. + """ + from gunicorn.app.wsgiapp import WSGIApplication + WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]", prog=prog).run() + + +if __name__ == '__main__': + run() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/arbiter.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/arbiter.py new file mode 100644 index 00000000..1eaf453d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/arbiter.py @@ -0,0 +1,671 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. +import errno +import os +import random +import select +import signal +import sys +import time +import traceback + +from gunicorn.errors import HaltServer, AppImportError +from gunicorn.pidfile import Pidfile +from gunicorn import sock, systemd, util + +from gunicorn import __version__, SERVER_SOFTWARE + + +class Arbiter: + """ + Arbiter maintain the workers processes alive. It launches or + kills them if needed. It also manages application reloading + via SIGHUP/USR2. + """ + + # A flag indicating if a worker failed to + # to boot. If a worker process exist with + # this error code, the arbiter will terminate. + WORKER_BOOT_ERROR = 3 + + # A flag indicating if an application failed to be loaded + APP_LOAD_ERROR = 4 + + START_CTX = {} + + LISTENERS = [] + WORKERS = {} + PIPE = [] + + # I love dynamic languages + SIG_QUEUE = [] + SIGNALS = [getattr(signal, "SIG%s" % x) + for x in "HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCH".split()] + SIG_NAMES = dict( + (getattr(signal, name), name[3:].lower()) for name in dir(signal) + if name[:3] == "SIG" and name[3] != "_" + ) + + def __init__(self, app): + os.environ["SERVER_SOFTWARE"] = SERVER_SOFTWARE + + self._num_workers = None + self._last_logged_active_worker_count = None + self.log = None + + self.setup(app) + + self.pidfile = None + self.systemd = False + self.worker_age = 0 + self.reexec_pid = 0 + self.master_pid = 0 + self.master_name = "Master" + + cwd = util.getcwd() + + args = sys.argv[:] + args.insert(0, sys.executable) + + # init start context + self.START_CTX = { + "args": args, + "cwd": cwd, + 0: sys.executable + } + + def _get_num_workers(self): + return self._num_workers + + def _set_num_workers(self, value): + old_value = self._num_workers + self._num_workers = value + self.cfg.nworkers_changed(self, value, old_value) + num_workers = property(_get_num_workers, _set_num_workers) + + def setup(self, app): + self.app = app + self.cfg = app.cfg + + if self.log is None: + self.log = self.cfg.logger_class(app.cfg) + + # reopen files + if 'GUNICORN_PID' in os.environ: + self.log.reopen_files() + + self.worker_class = self.cfg.worker_class + self.address = self.cfg.address + self.num_workers = self.cfg.workers + self.timeout = self.cfg.timeout + self.proc_name = self.cfg.proc_name + + self.log.debug('Current configuration:\n{0}'.format( + '\n'.join( + ' {0}: {1}'.format(config, value.value) + for config, value + in sorted(self.cfg.settings.items(), + key=lambda setting: setting[1])))) + + # set environment' variables + if self.cfg.env: + for k, v in self.cfg.env.items(): + os.environ[k] = v + + if self.cfg.preload_app: + self.app.wsgi() + + def start(self): + """\ + Initialize the arbiter. Start listening and set pidfile if needed. + """ + self.log.info("Starting gunicorn %s", __version__) + + if 'GUNICORN_PID' in os.environ: + self.master_pid = int(os.environ.get('GUNICORN_PID')) + self.proc_name = self.proc_name + ".2" + self.master_name = "Master.2" + + self.pid = os.getpid() + if self.cfg.pidfile is not None: + pidname = self.cfg.pidfile + if self.master_pid != 0: + pidname += ".2" + self.pidfile = Pidfile(pidname) + self.pidfile.create(self.pid) + self.cfg.on_starting(self) + + self.init_signals() + + if not self.LISTENERS: + fds = None + listen_fds = systemd.listen_fds() + if listen_fds: + self.systemd = True + fds = range(systemd.SD_LISTEN_FDS_START, + systemd.SD_LISTEN_FDS_START + listen_fds) + + elif self.master_pid: + fds = [] + for fd in os.environ.pop('GUNICORN_FD').split(','): + fds.append(int(fd)) + + self.LISTENERS = sock.create_sockets(self.cfg, self.log, fds) + + listeners_str = ",".join([str(lnr) for lnr in self.LISTENERS]) + self.log.debug("Arbiter booted") + self.log.info("Listening at: %s (%s)", listeners_str, self.pid) + self.log.info("Using worker: %s", self.cfg.worker_class_str) + systemd.sd_notify("READY=1\nSTATUS=Gunicorn arbiter booted", self.log) + + # check worker class requirements + if hasattr(self.worker_class, "check_config"): + self.worker_class.check_config(self.cfg, self.log) + + self.cfg.when_ready(self) + + def init_signals(self): + """\ + Initialize master signal handling. Most of the signals + are queued. Child signals only wake up the master. + """ + # close old PIPE + for p in self.PIPE: + os.close(p) + + # initialize the pipe + self.PIPE = pair = os.pipe() + for p in pair: + util.set_non_blocking(p) + util.close_on_exec(p) + + self.log.close_on_exec() + + # initialize all signals + for s in self.SIGNALS: + signal.signal(s, self.signal) + signal.signal(signal.SIGCHLD, self.handle_chld) + + def signal(self, sig, frame): + if len(self.SIG_QUEUE) < 5: + self.SIG_QUEUE.append(sig) + self.wakeup() + + def run(self): + "Main master loop." + self.start() + util._setproctitle("master [%s]" % self.proc_name) + + try: + self.manage_workers() + + while True: + self.maybe_promote_master() + + sig = self.SIG_QUEUE.pop(0) if self.SIG_QUEUE else None + if sig is None: + self.sleep() + self.murder_workers() + self.manage_workers() + continue + + if sig not in self.SIG_NAMES: + self.log.info("Ignoring unknown signal: %s", sig) + continue + + signame = self.SIG_NAMES.get(sig) + handler = getattr(self, "handle_%s" % signame, None) + if not handler: + self.log.error("Unhandled signal: %s", signame) + continue + self.log.info("Handling signal: %s", signame) + handler() + self.wakeup() + except (StopIteration, KeyboardInterrupt): + self.halt() + except HaltServer as inst: + self.halt(reason=inst.reason, exit_status=inst.exit_status) + except SystemExit: + raise + except Exception: + self.log.error("Unhandled exception in main loop", + exc_info=True) + self.stop(False) + if self.pidfile is not None: + self.pidfile.unlink() + sys.exit(-1) + + def handle_chld(self, sig, frame): + "SIGCHLD handling" + self.reap_workers() + self.wakeup() + + def handle_hup(self): + """\ + HUP handling. + - Reload configuration + - Start the new worker processes with a new configuration + - Gracefully shutdown the old worker processes + """ + self.log.info("Hang up: %s", self.master_name) + self.reload() + + def handle_term(self): + "SIGTERM handling" + raise StopIteration + + def handle_int(self): + "SIGINT handling" + self.stop(False) + raise StopIteration + + def handle_quit(self): + "SIGQUIT handling" + self.stop(False) + raise StopIteration + + def handle_ttin(self): + """\ + SIGTTIN handling. + Increases the number of workers by one. + """ + self.num_workers += 1 + self.manage_workers() + + def handle_ttou(self): + """\ + SIGTTOU handling. + Decreases the number of workers by one. + """ + if self.num_workers <= 1: + return + self.num_workers -= 1 + self.manage_workers() + + def handle_usr1(self): + """\ + SIGUSR1 handling. + Kill all workers by sending them a SIGUSR1 + """ + self.log.reopen_files() + self.kill_workers(signal.SIGUSR1) + + def handle_usr2(self): + """\ + SIGUSR2 handling. + Creates a new arbiter/worker set as a fork of the current + arbiter without affecting old workers. Use this to do live + deployment with the ability to backout a change. + """ + self.reexec() + + def handle_winch(self): + """SIGWINCH handling""" + if self.cfg.daemon: + self.log.info("graceful stop of workers") + self.num_workers = 0 + self.kill_workers(signal.SIGTERM) + else: + self.log.debug("SIGWINCH ignored. Not daemonized") + + def maybe_promote_master(self): + if self.master_pid == 0: + return + + if self.master_pid != os.getppid(): + self.log.info("Master has been promoted.") + # reset master infos + self.master_name = "Master" + self.master_pid = 0 + self.proc_name = self.cfg.proc_name + del os.environ['GUNICORN_PID'] + # rename the pidfile + if self.pidfile is not None: + self.pidfile.rename(self.cfg.pidfile) + # reset proctitle + util._setproctitle("master [%s]" % self.proc_name) + + def wakeup(self): + """\ + Wake up the arbiter by writing to the PIPE + """ + try: + os.write(self.PIPE[1], b'.') + except OSError as e: + if e.errno not in [errno.EAGAIN, errno.EINTR]: + raise + + def halt(self, reason=None, exit_status=0): + """ halt arbiter """ + self.stop() + + log_func = self.log.info if exit_status == 0 else self.log.error + log_func("Shutting down: %s", self.master_name) + if reason is not None: + log_func("Reason: %s", reason) + + if self.pidfile is not None: + self.pidfile.unlink() + self.cfg.on_exit(self) + sys.exit(exit_status) + + def sleep(self): + """\ + Sleep until PIPE is readable or we timeout. + A readable PIPE means a signal occurred. + """ + try: + ready = select.select([self.PIPE[0]], [], [], 1.0) + if not ready[0]: + return + while os.read(self.PIPE[0], 1): + pass + except OSError as e: + # TODO: select.error is a subclass of OSError since Python 3.3. + error_number = getattr(e, 'errno', e.args[0]) + if error_number not in [errno.EAGAIN, errno.EINTR]: + raise + except KeyboardInterrupt: + sys.exit() + + def stop(self, graceful=True): + """\ + Stop workers + + :attr graceful: boolean, If True (the default) workers will be + killed gracefully (ie. trying to wait for the current connection) + """ + unlink = ( + self.reexec_pid == self.master_pid == 0 + and not self.systemd + and not self.cfg.reuse_port + ) + sock.close_sockets(self.LISTENERS, unlink) + + self.LISTENERS = [] + sig = signal.SIGTERM + if not graceful: + sig = signal.SIGQUIT + limit = time.time() + self.cfg.graceful_timeout + # instruct the workers to exit + self.kill_workers(sig) + # wait until the graceful timeout + while self.WORKERS and time.time() < limit: + time.sleep(0.1) + + self.kill_workers(signal.SIGKILL) + + def reexec(self): + """\ + Relaunch the master and workers. + """ + if self.reexec_pid != 0: + self.log.warning("USR2 signal ignored. Child exists.") + return + + if self.master_pid != 0: + self.log.warning("USR2 signal ignored. Parent exists.") + return + + master_pid = os.getpid() + self.reexec_pid = os.fork() + if self.reexec_pid != 0: + return + + self.cfg.pre_exec(self) + + environ = self.cfg.env_orig.copy() + environ['GUNICORN_PID'] = str(master_pid) + + if self.systemd: + environ['LISTEN_PID'] = str(os.getpid()) + environ['LISTEN_FDS'] = str(len(self.LISTENERS)) + else: + environ['GUNICORN_FD'] = ','.join( + str(lnr.fileno()) for lnr in self.LISTENERS) + + os.chdir(self.START_CTX['cwd']) + + # exec the process using the original environment + os.execvpe(self.START_CTX[0], self.START_CTX['args'], environ) + + def reload(self): + old_address = self.cfg.address + + # reset old environment + for k in self.cfg.env: + if k in self.cfg.env_orig: + # reset the key to the value it had before + # we launched gunicorn + os.environ[k] = self.cfg.env_orig[k] + else: + # delete the value set by gunicorn + try: + del os.environ[k] + except KeyError: + pass + + # reload conf + self.app.reload() + self.setup(self.app) + + # reopen log files + self.log.reopen_files() + + # do we need to change listener ? + if old_address != self.cfg.address: + # close all listeners + for lnr in self.LISTENERS: + lnr.close() + # init new listeners + self.LISTENERS = sock.create_sockets(self.cfg, self.log) + listeners_str = ",".join([str(lnr) for lnr in self.LISTENERS]) + self.log.info("Listening at: %s", listeners_str) + + # do some actions on reload + self.cfg.on_reload(self) + + # unlink pidfile + if self.pidfile is not None: + self.pidfile.unlink() + + # create new pidfile + if self.cfg.pidfile is not None: + self.pidfile = Pidfile(self.cfg.pidfile) + self.pidfile.create(self.pid) + + # set new proc_name + util._setproctitle("master [%s]" % self.proc_name) + + # spawn new workers + for _ in range(self.cfg.workers): + self.spawn_worker() + + # manage workers + self.manage_workers() + + def murder_workers(self): + """\ + Kill unused/idle workers + """ + if not self.timeout: + return + workers = list(self.WORKERS.items()) + for (pid, worker) in workers: + try: + if time.monotonic() - worker.tmp.last_update() <= self.timeout: + continue + except (OSError, ValueError): + continue + + if not worker.aborted: + self.log.critical("WORKER TIMEOUT (pid:%s)", pid) + worker.aborted = True + self.kill_worker(pid, signal.SIGABRT) + else: + self.kill_worker(pid, signal.SIGKILL) + + def reap_workers(self): + """\ + Reap workers to avoid zombie processes + """ + try: + while True: + wpid, status = os.waitpid(-1, os.WNOHANG) + if not wpid: + break + if self.reexec_pid == wpid: + self.reexec_pid = 0 + else: + # A worker was terminated. If the termination reason was + # that it could not boot, we'll shut it down to avoid + # infinite start/stop cycles. + exitcode = status >> 8 + if exitcode != 0: + self.log.error('Worker (pid:%s) exited with code %s', wpid, exitcode) + if exitcode == self.WORKER_BOOT_ERROR: + reason = "Worker failed to boot." + raise HaltServer(reason, self.WORKER_BOOT_ERROR) + if exitcode == self.APP_LOAD_ERROR: + reason = "App failed to load." + raise HaltServer(reason, self.APP_LOAD_ERROR) + + if exitcode > 0: + # If the exit code of the worker is greater than 0, + # let the user know. + self.log.error("Worker (pid:%s) exited with code %s.", + wpid, exitcode) + elif status > 0: + # If the exit code of the worker is 0 and the status + # is greater than 0, then it was most likely killed + # via a signal. + try: + sig_name = signal.Signals(status).name + except ValueError: + sig_name = "code {}".format(status) + msg = "Worker (pid:{}) was sent {}!".format( + wpid, sig_name) + + # Additional hint for SIGKILL + if status == signal.SIGKILL: + msg += " Perhaps out of memory?" + self.log.error(msg) + + worker = self.WORKERS.pop(wpid, None) + if not worker: + continue + worker.tmp.close() + self.cfg.child_exit(self, worker) + except OSError as e: + if e.errno != errno.ECHILD: + raise + + def manage_workers(self): + """\ + Maintain the number of workers by spawning or killing + as required. + """ + if len(self.WORKERS) < self.num_workers: + self.spawn_workers() + + workers = self.WORKERS.items() + workers = sorted(workers, key=lambda w: w[1].age) + while len(workers) > self.num_workers: + (pid, _) = workers.pop(0) + self.kill_worker(pid, signal.SIGTERM) + + active_worker_count = len(workers) + if self._last_logged_active_worker_count != active_worker_count: + self._last_logged_active_worker_count = active_worker_count + self.log.debug("{0} workers".format(active_worker_count), + extra={"metric": "gunicorn.workers", + "value": active_worker_count, + "mtype": "gauge"}) + + def spawn_worker(self): + self.worker_age += 1 + worker = self.worker_class(self.worker_age, self.pid, self.LISTENERS, + self.app, self.timeout / 2.0, + self.cfg, self.log) + self.cfg.pre_fork(self, worker) + pid = os.fork() + if pid != 0: + worker.pid = pid + self.WORKERS[pid] = worker + return pid + + # Do not inherit the temporary files of other workers + for sibling in self.WORKERS.values(): + sibling.tmp.close() + + # Process Child + worker.pid = os.getpid() + try: + util._setproctitle("worker [%s]" % self.proc_name) + self.log.info("Booting worker with pid: %s", worker.pid) + self.cfg.post_fork(self, worker) + worker.init_process() + sys.exit(0) + except SystemExit: + raise + except AppImportError as e: + self.log.debug("Exception while loading the application", + exc_info=True) + print("%s" % e, file=sys.stderr) + sys.stderr.flush() + sys.exit(self.APP_LOAD_ERROR) + except Exception: + self.log.exception("Exception in worker process") + if not worker.booted: + sys.exit(self.WORKER_BOOT_ERROR) + sys.exit(-1) + finally: + self.log.info("Worker exiting (pid: %s)", worker.pid) + try: + worker.tmp.close() + self.cfg.worker_exit(self, worker) + except Exception: + self.log.warning("Exception during worker exit:\n%s", + traceback.format_exc()) + + def spawn_workers(self): + """\ + Spawn new workers as needed. + + This is where a worker process leaves the main loop + of the master process. + """ + + for _ in range(self.num_workers - len(self.WORKERS)): + self.spawn_worker() + time.sleep(0.1 * random.random()) + + def kill_workers(self, sig): + """\ + Kill all workers with the signal `sig` + :attr sig: `signal.SIG*` value + """ + worker_pids = list(self.WORKERS.keys()) + for pid in worker_pids: + self.kill_worker(pid, sig) + + def kill_worker(self, pid, sig): + """\ + Kill a worker + + :attr pid: int, worker pid + :attr sig: `signal.SIG*` value + """ + try: + os.kill(pid, sig) + except OSError as e: + if e.errno == errno.ESRCH: + try: + worker = self.WORKERS.pop(pid) + worker.tmp.close() + self.cfg.worker_exit(self, worker) + return + except (KeyError, OSError): + return + raise diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/config.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/config.py new file mode 100644 index 00000000..402a26b6 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/config.py @@ -0,0 +1,2442 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# Please remember to run "make -C docs html" after update "desc" attributes. + +import argparse +import copy +import grp +import inspect +import ipaddress +import os +import pwd +import re +import shlex +import ssl +import sys +import textwrap + +from gunicorn import __version__, util +from gunicorn.errors import ConfigError +from gunicorn.reloader import reloader_engines + +KNOWN_SETTINGS = [] +PLATFORM = sys.platform + + +def make_settings(ignore=None): + settings = {} + ignore = ignore or () + for s in KNOWN_SETTINGS: + setting = s() + if setting.name in ignore: + continue + settings[setting.name] = setting.copy() + return settings + + +def auto_int(_, x): + # for compatible with octal numbers in python3 + if re.match(r'0(\d)', x, re.IGNORECASE): + x = x.replace('0', '0o', 1) + return int(x, 0) + + +class Config: + + def __init__(self, usage=None, prog=None): + self.settings = make_settings() + self.usage = usage + self.prog = prog or os.path.basename(sys.argv[0]) + self.env_orig = os.environ.copy() + + def __str__(self): + lines = [] + kmax = max(len(k) for k in self.settings) + for k in sorted(self.settings): + v = self.settings[k].value + if callable(v): + v = "<{}()>".format(v.__qualname__) + lines.append("{k:{kmax}} = {v}".format(k=k, v=v, kmax=kmax)) + return "\n".join(lines) + + def __getattr__(self, name): + if name not in self.settings: + raise AttributeError("No configuration setting for: %s" % name) + return self.settings[name].get() + + def __setattr__(self, name, value): + if name != "settings" and name in self.settings: + raise AttributeError("Invalid access!") + super().__setattr__(name, value) + + def set(self, name, value): + if name not in self.settings: + raise AttributeError("No configuration setting for: %s" % name) + self.settings[name].set(value) + + def get_cmd_args_from_env(self): + if 'GUNICORN_CMD_ARGS' in self.env_orig: + return shlex.split(self.env_orig['GUNICORN_CMD_ARGS']) + return [] + + def parser(self): + kwargs = { + "usage": self.usage, + "prog": self.prog + } + parser = argparse.ArgumentParser(**kwargs) + parser.add_argument("-v", "--version", + action="version", default=argparse.SUPPRESS, + version="%(prog)s (version " + __version__ + ")\n", + help="show program's version number and exit") + parser.add_argument("args", nargs="*", help=argparse.SUPPRESS) + + keys = sorted(self.settings, key=self.settings.__getitem__) + for k in keys: + self.settings[k].add_option(parser) + + return parser + + @property + def worker_class_str(self): + uri = self.settings['worker_class'].get() + + if isinstance(uri, str): + # are we using a threaded worker? + is_sync = uri.endswith('SyncWorker') or uri == 'sync' + if is_sync and self.threads > 1: + return "gthread" + return uri + return uri.__name__ + + @property + def worker_class(self): + uri = self.settings['worker_class'].get() + + # are we using a threaded worker? + is_sync = isinstance(uri, str) and (uri.endswith('SyncWorker') or uri == 'sync') + if is_sync and self.threads > 1: + uri = "gunicorn.workers.gthread.ThreadWorker" + + worker_class = util.load_class(uri) + if hasattr(worker_class, "setup"): + worker_class.setup() + return worker_class + + @property + def address(self): + s = self.settings['bind'].get() + return [util.parse_address(util.bytes_to_str(bind)) for bind in s] + + @property + def uid(self): + return self.settings['user'].get() + + @property + def gid(self): + return self.settings['group'].get() + + @property + def proc_name(self): + pn = self.settings['proc_name'].get() + if pn is not None: + return pn + else: + return self.settings['default_proc_name'].get() + + @property + def logger_class(self): + uri = self.settings['logger_class'].get() + if uri == "simple": + # support the default + uri = LoggerClass.default + + # if default logger is in use, and statsd is on, automagically switch + # to the statsd logger + if uri == LoggerClass.default: + if 'statsd_host' in self.settings and self.settings['statsd_host'].value is not None: + uri = "gunicorn.instrument.statsd.Statsd" + + logger_class = util.load_class( + uri, + default="gunicorn.glogging.Logger", + section="gunicorn.loggers") + + if hasattr(logger_class, "install"): + logger_class.install() + return logger_class + + @property + def is_ssl(self): + return self.certfile or self.keyfile + + @property + def ssl_options(self): + opts = {} + for name, value in self.settings.items(): + if value.section == 'SSL': + opts[name] = value.get() + return opts + + @property + def env(self): + raw_env = self.settings['raw_env'].get() + env = {} + + if not raw_env: + return env + + for e in raw_env: + s = util.bytes_to_str(e) + try: + k, v = s.split('=', 1) + except ValueError: + raise RuntimeError("environment setting %r invalid" % s) + + env[k] = v + + return env + + @property + def sendfile(self): + if self.settings['sendfile'].get() is not None: + return False + + if 'SENDFILE' in os.environ: + sendfile = os.environ['SENDFILE'].lower() + return sendfile in ['y', '1', 'yes', 'true'] + + return True + + @property + def reuse_port(self): + return self.settings['reuse_port'].get() + + @property + def paste_global_conf(self): + raw_global_conf = self.settings['raw_paste_global_conf'].get() + if raw_global_conf is None: + return None + + global_conf = {} + for e in raw_global_conf: + s = util.bytes_to_str(e) + try: + k, v = re.split(r'(?" % ( + self.__class__.__module__, + self.__class__.__name__, + id(self), + self.value, + ) + + +Setting = SettingMeta('Setting', (Setting,), {}) + + +def validate_bool(val): + if val is None: + return + + if isinstance(val, bool): + return val + if not isinstance(val, str): + raise TypeError("Invalid type for casting: %s" % val) + if val.lower().strip() == "true": + return True + elif val.lower().strip() == "false": + return False + else: + raise ValueError("Invalid boolean: %s" % val) + + +def validate_dict(val): + if not isinstance(val, dict): + raise TypeError("Value is not a dictionary: %s " % val) + return val + + +def validate_pos_int(val): + if not isinstance(val, int): + val = int(val, 0) + else: + # Booleans are ints! + val = int(val) + if val < 0: + raise ValueError("Value must be positive: %s" % val) + return val + + +def validate_ssl_version(val): + if val != SSLVersion.default: + sys.stderr.write("Warning: option `ssl_version` is deprecated and it is ignored. Use ssl_context instead.\n") + return val + + +def validate_string(val): + if val is None: + return None + if not isinstance(val, str): + raise TypeError("Not a string: %s" % val) + return val.strip() + + +def validate_file_exists(val): + if val is None: + return None + if not os.path.exists(val): + raise ValueError("File %s does not exists." % val) + return val + + +def validate_list_string(val): + if not val: + return [] + + # legacy syntax + if isinstance(val, str): + val = [val] + + return [validate_string(v) for v in val] + + +def validate_list_of_existing_files(val): + return [validate_file_exists(v) for v in validate_list_string(val)] + + +def validate_string_to_addr_list(val): + val = validate_string_to_list(val) + + for addr in val: + if addr == "*": + continue + _vaid_ip = ipaddress.ip_address(addr) + + return val + + +def validate_string_to_list(val): + val = validate_string(val) + + if not val: + return [] + + return [v.strip() for v in val.split(",") if v] + + +def validate_class(val): + if inspect.isfunction(val) or inspect.ismethod(val): + val = val() + if inspect.isclass(val): + return val + return validate_string(val) + + +def validate_callable(arity): + def _validate_callable(val): + if isinstance(val, str): + try: + mod_name, obj_name = val.rsplit(".", 1) + except ValueError: + raise TypeError("Value '%s' is not import string. " + "Format: module[.submodules...].object" % val) + try: + mod = __import__(mod_name, fromlist=[obj_name]) + val = getattr(mod, obj_name) + except ImportError as e: + raise TypeError(str(e)) + except AttributeError: + raise TypeError("Can not load '%s' from '%s'" + "" % (obj_name, mod_name)) + if not callable(val): + raise TypeError("Value is not callable: %s" % val) + if arity != -1 and arity != util.get_arity(val): + raise TypeError("Value must have an arity of: %s" % arity) + return val + return _validate_callable + + +def validate_user(val): + if val is None: + return os.geteuid() + if isinstance(val, int): + return val + elif val.isdigit(): + return int(val) + else: + try: + return pwd.getpwnam(val).pw_uid + except KeyError: + raise ConfigError("No such user: '%s'" % val) + + +def validate_group(val): + if val is None: + return os.getegid() + + if isinstance(val, int): + return val + elif val.isdigit(): + return int(val) + else: + try: + return grp.getgrnam(val).gr_gid + except KeyError: + raise ConfigError("No such group: '%s'" % val) + + +def validate_post_request(val): + val = validate_callable(-1)(val) + + largs = util.get_arity(val) + if largs == 4: + return val + elif largs == 3: + return lambda worker, req, env, _r: val(worker, req, env) + elif largs == 2: + return lambda worker, req, _e, _r: val(worker, req) + else: + raise TypeError("Value must have an arity of: 4") + + +def validate_chdir(val): + # valid if the value is a string + val = validate_string(val) + + # transform relative paths + path = os.path.abspath(os.path.normpath(os.path.join(util.getcwd(), val))) + + # test if the path exists + if not os.path.exists(path): + raise ConfigError("can't chdir to %r" % val) + + return path + + +def validate_statsd_address(val): + val = validate_string(val) + if val is None: + return None + + # As of major release 20, util.parse_address would recognize unix:PORT + # as a UDS address, breaking backwards compatibility. We defend against + # that regression here (this is also unit-tested). + # Feel free to remove in the next major release. + unix_hostname_regression = re.match(r'^unix:(\d+)$', val) + if unix_hostname_regression: + return ('unix', int(unix_hostname_regression.group(1))) + + try: + address = util.parse_address(val, default_port='8125') + except RuntimeError: + raise TypeError("Value must be one of ('host:port', 'unix://PATH')") + + return address + + +def validate_reload_engine(val): + if val not in reloader_engines: + raise ConfigError("Invalid reload_engine: %r" % val) + + return val + + +def get_default_config_file(): + config_path = os.path.join(os.path.abspath(os.getcwd()), + 'gunicorn.conf.py') + if os.path.exists(config_path): + return config_path + return None + + +class ConfigFile(Setting): + name = "config" + section = "Config File" + cli = ["-c", "--config"] + meta = "CONFIG" + validator = validate_string + default = "./gunicorn.conf.py" + desc = """\ + :ref:`The Gunicorn config file`. + + A string of the form ``PATH``, ``file:PATH``, or ``python:MODULE_NAME``. + + Only has an effect when specified on the command line or as part of an + application specific configuration. + + By default, a file named ``gunicorn.conf.py`` will be read from the same + directory where gunicorn is being run. + + .. versionchanged:: 19.4 + Loading the config from a Python module requires the ``python:`` + prefix. + """ + + +class WSGIApp(Setting): + name = "wsgi_app" + section = "Config File" + meta = "STRING" + validator = validate_string + default = None + desc = """\ + A WSGI application path in pattern ``$(MODULE_NAME):$(VARIABLE_NAME)``. + + .. versionadded:: 20.1.0 + """ + + +class Bind(Setting): + name = "bind" + action = "append" + section = "Server Socket" + cli = ["-b", "--bind"] + meta = "ADDRESS" + validator = validate_list_string + + if 'PORT' in os.environ: + default = ['0.0.0.0:{0}'.format(os.environ.get('PORT'))] + else: + default = ['127.0.0.1:8000'] + + desc = """\ + The socket to bind. + + A string of the form: ``HOST``, ``HOST:PORT``, ``unix:PATH``, + ``fd://FD``. An IP is a valid ``HOST``. + + .. versionchanged:: 20.0 + Support for ``fd://FD`` got added. + + Multiple addresses can be bound. ex.:: + + $ gunicorn -b 127.0.0.1:8000 -b [::1]:8000 test:app + + will bind the `test:app` application on localhost both on ipv6 + and ipv4 interfaces. + + If the ``PORT`` environment variable is defined, the default + is ``['0.0.0.0:$PORT']``. If it is not defined, the default + is ``['127.0.0.1:8000']``. + """ + + +class Backlog(Setting): + name = "backlog" + section = "Server Socket" + cli = ["--backlog"] + meta = "INT" + validator = validate_pos_int + type = int + default = 2048 + desc = """\ + The maximum number of pending connections. + + This refers to the number of clients that can be waiting to be served. + Exceeding this number results in the client getting an error when + attempting to connect. It should only affect servers under significant + load. + + Must be a positive integer. Generally set in the 64-2048 range. + """ + + +class Workers(Setting): + name = "workers" + section = "Worker Processes" + cli = ["-w", "--workers"] + meta = "INT" + validator = validate_pos_int + type = int + default = int(os.environ.get("WEB_CONCURRENCY", 1)) + desc = """\ + The number of worker processes for handling requests. + + A positive integer generally in the ``2-4 x $(NUM_CORES)`` range. + You'll want to vary this a bit to find the best for your particular + application's work load. + + By default, the value of the ``WEB_CONCURRENCY`` environment variable, + which is set by some Platform-as-a-Service providers such as Heroku. If + it is not defined, the default is ``1``. + """ + + +class WorkerClass(Setting): + name = "worker_class" + section = "Worker Processes" + cli = ["-k", "--worker-class"] + meta = "STRING" + validator = validate_class + default = "sync" + desc = """\ + The type of workers to use. + + The default class (``sync``) should handle most "normal" types of + workloads. You'll want to read :doc:`design` for information on when + you might want to choose one of the other worker classes. Required + libraries may be installed using setuptools' ``extras_require`` feature. + + A string referring to one of the following bundled classes: + + * ``sync`` + * ``eventlet`` - Requires eventlet >= 0.24.1 (or install it via + ``pip install gunicorn[eventlet]``) + * ``gevent`` - Requires gevent >= 1.4 (or install it via + ``pip install gunicorn[gevent]``) + * ``tornado`` - Requires tornado >= 0.2 (or install it via + ``pip install gunicorn[tornado]``) + * ``gthread`` - Python 2 requires the futures package to be installed + (or install it via ``pip install gunicorn[gthread]``) + + Optionally, you can provide your own worker by giving Gunicorn a + Python path to a subclass of ``gunicorn.workers.base.Worker``. + This alternative syntax will load the gevent class: + ``gunicorn.workers.ggevent.GeventWorker``. + """ + + +class WorkerThreads(Setting): + name = "threads" + section = "Worker Processes" + cli = ["--threads"] + meta = "INT" + validator = validate_pos_int + type = int + default = 1 + desc = """\ + The number of worker threads for handling requests. + + Run each worker with the specified number of threads. + + A positive integer generally in the ``2-4 x $(NUM_CORES)`` range. + You'll want to vary this a bit to find the best for your particular + application's work load. + + If it is not defined, the default is ``1``. + + This setting only affects the Gthread worker type. + + .. note:: + If you try to use the ``sync`` worker type and set the ``threads`` + setting to more than 1, the ``gthread`` worker type will be used + instead. + """ + + +class WorkerConnections(Setting): + name = "worker_connections" + section = "Worker Processes" + cli = ["--worker-connections"] + meta = "INT" + validator = validate_pos_int + type = int + default = 1000 + desc = """\ + The maximum number of simultaneous clients. + + This setting only affects the ``gthread``, ``eventlet`` and ``gevent`` worker types. + """ + + +class MaxRequests(Setting): + name = "max_requests" + section = "Worker Processes" + cli = ["--max-requests"] + meta = "INT" + validator = validate_pos_int + type = int + default = 0 + desc = """\ + The maximum number of requests a worker will process before restarting. + + Any value greater than zero will limit the number of requests a worker + will process before automatically restarting. This is a simple method + to help limit the damage of memory leaks. + + If this is set to zero (the default) then the automatic worker + restarts are disabled. + """ + + +class MaxRequestsJitter(Setting): + name = "max_requests_jitter" + section = "Worker Processes" + cli = ["--max-requests-jitter"] + meta = "INT" + validator = validate_pos_int + type = int + default = 0 + desc = """\ + The maximum jitter to add to the *max_requests* setting. + + The jitter causes the restart per worker to be randomized by + ``randint(0, max_requests_jitter)``. This is intended to stagger worker + restarts to avoid all workers restarting at the same time. + + .. versionadded:: 19.2 + """ + + +class Timeout(Setting): + name = "timeout" + section = "Worker Processes" + cli = ["-t", "--timeout"] + meta = "INT" + validator = validate_pos_int + type = int + default = 30 + desc = """\ + Workers silent for more than this many seconds are killed and restarted. + + Value is a positive number or 0. Setting it to 0 has the effect of + infinite timeouts by disabling timeouts for all workers entirely. + + Generally, the default of thirty seconds should suffice. Only set this + noticeably higher if you're sure of the repercussions for sync workers. + For the non sync workers it just means that the worker process is still + communicating and is not tied to the length of time required to handle a + single request. + """ + + +class GracefulTimeout(Setting): + name = "graceful_timeout" + section = "Worker Processes" + cli = ["--graceful-timeout"] + meta = "INT" + validator = validate_pos_int + type = int + default = 30 + desc = """\ + Timeout for graceful workers restart. + + After receiving a restart signal, workers have this much time to finish + serving requests. Workers still alive after the timeout (starting from + the receipt of the restart signal) are force killed. + """ + + +class Keepalive(Setting): + name = "keepalive" + section = "Worker Processes" + cli = ["--keep-alive"] + meta = "INT" + validator = validate_pos_int + type = int + default = 2 + desc = """\ + The number of seconds to wait for requests on a Keep-Alive connection. + + Generally set in the 1-5 seconds range for servers with direct connection + to the client (e.g. when you don't have separate load balancer). When + Gunicorn is deployed behind a load balancer, it often makes sense to + set this to a higher value. + + .. note:: + ``sync`` worker does not support persistent connections and will + ignore this option. + """ + + +class LimitRequestLine(Setting): + name = "limit_request_line" + section = "Security" + cli = ["--limit-request-line"] + meta = "INT" + validator = validate_pos_int + type = int + default = 4094 + desc = """\ + The maximum size of HTTP request line in bytes. + + This parameter is used to limit the allowed size of a client's + HTTP request-line. Since the request-line consists of the HTTP + method, URI, and protocol version, this directive places a + restriction on the length of a request-URI allowed for a request + on the server. A server needs this value to be large enough to + hold any of its resource names, including any information that + might be passed in the query part of a GET request. Value is a number + from 0 (unlimited) to 8190. + + This parameter can be used to prevent any DDOS attack. + """ + + +class LimitRequestFields(Setting): + name = "limit_request_fields" + section = "Security" + cli = ["--limit-request-fields"] + meta = "INT" + validator = validate_pos_int + type = int + default = 100 + desc = """\ + Limit the number of HTTP headers fields in a request. + + This parameter is used to limit the number of headers in a request to + prevent DDOS attack. Used with the *limit_request_field_size* it allows + more safety. By default this value is 100 and can't be larger than + 32768. + """ + + +class LimitRequestFieldSize(Setting): + name = "limit_request_field_size" + section = "Security" + cli = ["--limit-request-field_size"] + meta = "INT" + validator = validate_pos_int + type = int + default = 8190 + desc = """\ + Limit the allowed size of an HTTP request header field. + + Value is a positive number or 0. Setting it to 0 will allow unlimited + header field sizes. + + .. warning:: + Setting this parameter to a very high or unlimited value can open + up for DDOS attacks. + """ + + +class Reload(Setting): + name = "reload" + section = 'Debugging' + cli = ['--reload'] + validator = validate_bool + action = 'store_true' + default = False + + desc = '''\ + Restart workers when code changes. + + This setting is intended for development. It will cause workers to be + restarted whenever application code changes. + + The reloader is incompatible with application preloading. When using a + paste configuration be sure that the server block does not import any + application code or the reload will not work as designed. + + The default behavior is to attempt inotify with a fallback to file + system polling. Generally, inotify should be preferred if available + because it consumes less system resources. + + .. note:: + In order to use the inotify reloader, you must have the ``inotify`` + package installed. + ''' + + +class ReloadEngine(Setting): + name = "reload_engine" + section = "Debugging" + cli = ["--reload-engine"] + meta = "STRING" + validator = validate_reload_engine + default = "auto" + desc = """\ + The implementation that should be used to power :ref:`reload`. + + Valid engines are: + + * ``'auto'`` + * ``'poll'`` + * ``'inotify'`` (requires inotify) + + .. versionadded:: 19.7 + """ + + +class ReloadExtraFiles(Setting): + name = "reload_extra_files" + action = "append" + section = "Debugging" + cli = ["--reload-extra-file"] + meta = "FILES" + validator = validate_list_of_existing_files + default = [] + desc = """\ + Extends :ref:`reload` option to also watch and reload on additional files + (e.g., templates, configurations, specifications, etc.). + + .. versionadded:: 19.8 + """ + + +class Spew(Setting): + name = "spew" + section = "Debugging" + cli = ["--spew"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Install a trace function that spews every line executed by the server. + + This is the nuclear option. + """ + + +class ConfigCheck(Setting): + name = "check_config" + section = "Debugging" + cli = ["--check-config"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Check the configuration and exit. The exit status is 0 if the + configuration is correct, and 1 if the configuration is incorrect. + """ + + +class PrintConfig(Setting): + name = "print_config" + section = "Debugging" + cli = ["--print-config"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Print the configuration settings as fully resolved. Implies :ref:`check-config`. + """ + + +class PreloadApp(Setting): + name = "preload_app" + section = "Server Mechanics" + cli = ["--preload"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Load application code before the worker processes are forked. + + By preloading an application you can save some RAM resources as well as + speed up server boot times. Although, if you defer application loading + to each worker process, you can reload your application code easily by + restarting workers. + """ + + +class Sendfile(Setting): + name = "sendfile" + section = "Server Mechanics" + cli = ["--no-sendfile"] + validator = validate_bool + action = "store_const" + const = False + + desc = """\ + Disables the use of ``sendfile()``. + + If not set, the value of the ``SENDFILE`` environment variable is used + to enable or disable its usage. + + .. versionadded:: 19.2 + .. versionchanged:: 19.4 + Swapped ``--sendfile`` with ``--no-sendfile`` to actually allow + disabling. + .. versionchanged:: 19.6 + added support for the ``SENDFILE`` environment variable + """ + + +class ReusePort(Setting): + name = "reuse_port" + section = "Server Mechanics" + cli = ["--reuse-port"] + validator = validate_bool + action = "store_true" + default = False + + desc = """\ + Set the ``SO_REUSEPORT`` flag on the listening socket. + + .. versionadded:: 19.8 + """ + + +class Chdir(Setting): + name = "chdir" + section = "Server Mechanics" + cli = ["--chdir"] + validator = validate_chdir + default = util.getcwd() + default_doc = "``'.'``" + desc = """\ + Change directory to specified directory before loading apps. + """ + + +class Daemon(Setting): + name = "daemon" + section = "Server Mechanics" + cli = ["-D", "--daemon"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Daemonize the Gunicorn process. + + Detaches the server from the controlling terminal and enters the + background. + """ + + +class Env(Setting): + name = "raw_env" + action = "append" + section = "Server Mechanics" + cli = ["-e", "--env"] + meta = "ENV" + validator = validate_list_string + default = [] + + desc = """\ + Set environment variables in the execution environment. + + Should be a list of strings in the ``key=value`` format. + + For example on the command line: + + .. code-block:: console + + $ gunicorn -b 127.0.0.1:8000 --env FOO=1 test:app + + Or in the configuration file: + + .. code-block:: python + + raw_env = ["FOO=1"] + """ + + +class Pidfile(Setting): + name = "pidfile" + section = "Server Mechanics" + cli = ["-p", "--pid"] + meta = "FILE" + validator = validate_string + default = None + desc = """\ + A filename to use for the PID file. + + If not set, no PID file will be written. + """ + + +class WorkerTmpDir(Setting): + name = "worker_tmp_dir" + section = "Server Mechanics" + cli = ["--worker-tmp-dir"] + meta = "DIR" + validator = validate_string + default = None + desc = """\ + A directory to use for the worker heartbeat temporary file. + + If not set, the default temporary directory will be used. + + .. note:: + The current heartbeat system involves calling ``os.fchmod`` on + temporary file handlers and may block a worker for arbitrary time + if the directory is on a disk-backed filesystem. + + See :ref:`blocking-os-fchmod` for more detailed information + and a solution for avoiding this problem. + """ + + +class User(Setting): + name = "user" + section = "Server Mechanics" + cli = ["-u", "--user"] + meta = "USER" + validator = validate_user + default = os.geteuid() + default_doc = "``os.geteuid()``" + desc = """\ + Switch worker processes to run as this user. + + A valid user id (as an integer) or the name of a user that can be + retrieved with a call to ``pwd.getpwnam(value)`` or ``None`` to not + change the worker process user. + """ + + +class Group(Setting): + name = "group" + section = "Server Mechanics" + cli = ["-g", "--group"] + meta = "GROUP" + validator = validate_group + default = os.getegid() + default_doc = "``os.getegid()``" + desc = """\ + Switch worker process to run as this group. + + A valid group id (as an integer) or the name of a user that can be + retrieved with a call to ``pwd.getgrnam(value)`` or ``None`` to not + change the worker processes group. + """ + + +class Umask(Setting): + name = "umask" + section = "Server Mechanics" + cli = ["-m", "--umask"] + meta = "INT" + validator = validate_pos_int + type = auto_int + default = 0 + desc = """\ + A bit mask for the file mode on files written by Gunicorn. + + Note that this affects unix socket permissions. + + A valid value for the ``os.umask(mode)`` call or a string compatible + with ``int(value, 0)`` (``0`` means Python guesses the base, so values + like ``0``, ``0xFF``, ``0022`` are valid for decimal, hex, and octal + representations) + """ + + +class Initgroups(Setting): + name = "initgroups" + section = "Server Mechanics" + cli = ["--initgroups"] + validator = validate_bool + action = 'store_true' + default = False + + desc = """\ + If true, set the worker process's group access list with all of the + groups of which the specified username is a member, plus the specified + group id. + + .. versionadded:: 19.7 + """ + + +class TmpUploadDir(Setting): + name = "tmp_upload_dir" + section = "Server Mechanics" + meta = "DIR" + validator = validate_string + default = None + desc = """\ + Directory to store temporary request data as they are read. + + This may disappear in the near future. + + This path should be writable by the process permissions set for Gunicorn + workers. If not specified, Gunicorn will choose a system generated + temporary directory. + """ + + +class SecureSchemeHeader(Setting): + name = "secure_scheme_headers" + section = "Server Mechanics" + validator = validate_dict + default = { + "X-FORWARDED-PROTOCOL": "ssl", + "X-FORWARDED-PROTO": "https", + "X-FORWARDED-SSL": "on" + } + desc = """\ + + A dictionary containing headers and values that the front-end proxy + uses to indicate HTTPS requests. If the source IP is permitted by + :ref:`forwarded-allow-ips` (below), *and* at least one request header matches + a key-value pair listed in this dictionary, then Gunicorn will set + ``wsgi.url_scheme`` to ``https``, so your application can tell that the + request is secure. + + If the other headers listed in this dictionary are not present in the request, they will be ignored, + but if the other headers are present and do not match the provided values, then + the request will fail to parse. See the note below for more detailed examples of this behaviour. + + The dictionary should map upper-case header names to exact string + values. The value comparisons are case-sensitive, unlike the header + names, so make sure they're exactly what your front-end proxy sends + when handling HTTPS requests. + + It is important that your front-end proxy configuration ensures that + the headers defined here can not be passed directly from the client. + """ + + +class ForwardedAllowIPS(Setting): + name = "forwarded_allow_ips" + section = "Server Mechanics" + cli = ["--forwarded-allow-ips"] + meta = "STRING" + validator = validate_string_to_addr_list + default = os.environ.get("FORWARDED_ALLOW_IPS", "127.0.0.1,::1") + desc = """\ + Front-end's IPs from which allowed to handle set secure headers. + (comma separated). + + Set to ``*`` to disable checking of front-end IPs. This is useful for setups + where you don't know in advance the IP address of front-end, but + instead have ensured via other means that only your + authorized front-ends can access Gunicorn. + + By default, the value of the ``FORWARDED_ALLOW_IPS`` environment + variable. If it is not defined, the default is ``"127.0.0.1,::1"``. + + .. note:: + + This option does not affect UNIX socket connections. Connections not associated with + an IP address are treated as allowed, unconditionally. + + .. note:: + + The interplay between the request headers, the value of ``forwarded_allow_ips``, and the value of + ``secure_scheme_headers`` is complex. Various scenarios are documented below to further elaborate. + In each case, we have a request from the remote address 134.213.44.18, and the default value of + ``secure_scheme_headers``: + + .. code:: + + secure_scheme_headers = { + 'X-FORWARDED-PROTOCOL': 'ssl', + 'X-FORWARDED-PROTO': 'https', + 'X-FORWARDED-SSL': 'on' + } + + + .. list-table:: + :header-rows: 1 + :align: center + :widths: auto + + * - ``forwarded-allow-ips`` + - Secure Request Headers + - Result + - Explanation + * - .. code:: + + ["127.0.0.1"] + - .. code:: + + X-Forwarded-Proto: https + - .. code:: + + wsgi.url_scheme = "http" + - IP address was not allowed + * - .. code:: + + "*" + - + - .. code:: + + wsgi.url_scheme = "http" + - IP address allowed, but no secure headers provided + * - .. code:: + + "*" + - .. code:: + + X-Forwarded-Proto: https + - .. code:: + + wsgi.url_scheme = "https" + - IP address allowed, one request header matched + * - .. code:: + + ["134.213.44.18"] + - .. code:: + + X-Forwarded-Ssl: on + X-Forwarded-Proto: http + - ``InvalidSchemeHeaders()`` raised + - IP address allowed, but the two secure headers disagreed on if HTTPS was used + + + """ + + +class AccessLog(Setting): + name = "accesslog" + section = "Logging" + cli = ["--access-logfile"] + meta = "FILE" + validator = validate_string + default = None + desc = """\ + The Access log file to write to. + + ``'-'`` means log to stdout. + """ + + +class DisableRedirectAccessToSyslog(Setting): + name = "disable_redirect_access_to_syslog" + section = "Logging" + cli = ["--disable-redirect-access-to-syslog"] + validator = validate_bool + action = 'store_true' + default = False + desc = """\ + Disable redirect access logs to syslog. + + .. versionadded:: 19.8 + """ + + +class AccessLogFormat(Setting): + name = "access_log_format" + section = "Logging" + cli = ["--access-logformat"] + meta = "STRING" + validator = validate_string + default = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' + desc = """\ + The access log format. + + =========== =========== + Identifier Description + =========== =========== + h remote address + l ``'-'`` + u user name (if HTTP Basic auth used) + t date of the request + r status line (e.g. ``GET / HTTP/1.1``) + m request method + U URL path without query string + q query string + H protocol + s status + B response length + b response length or ``'-'`` (CLF format) + f referrer (note: header is ``referer``) + a user agent + T request time in seconds + M request time in milliseconds + D request time in microseconds + L request time in decimal seconds + p process ID + {header}i request header + {header}o response header + {variable}e environment variable + =========== =========== + + Use lowercase for header and environment variable names, and put + ``{...}x`` names inside ``%(...)s``. For example:: + + %({x-forwarded-for}i)s + """ + + +class ErrorLog(Setting): + name = "errorlog" + section = "Logging" + cli = ["--error-logfile", "--log-file"] + meta = "FILE" + validator = validate_string + default = '-' + desc = """\ + The Error log file to write to. + + Using ``'-'`` for FILE makes gunicorn log to stderr. + + .. versionchanged:: 19.2 + Log to stderr by default. + + """ + + +class Loglevel(Setting): + name = "loglevel" + section = "Logging" + cli = ["--log-level"] + meta = "LEVEL" + validator = validate_string + default = "info" + desc = """\ + The granularity of Error log outputs. + + Valid level names are: + + * ``'debug'`` + * ``'info'`` + * ``'warning'`` + * ``'error'`` + * ``'critical'`` + """ + + +class CaptureOutput(Setting): + name = "capture_output" + section = "Logging" + cli = ["--capture-output"] + validator = validate_bool + action = 'store_true' + default = False + desc = """\ + Redirect stdout/stderr to specified file in :ref:`errorlog`. + + .. versionadded:: 19.6 + """ + + +class LoggerClass(Setting): + name = "logger_class" + section = "Logging" + cli = ["--logger-class"] + meta = "STRING" + validator = validate_class + default = "gunicorn.glogging.Logger" + desc = """\ + The logger you want to use to log events in Gunicorn. + + The default class (``gunicorn.glogging.Logger``) handles most + normal usages in logging. It provides error and access logging. + + You can provide your own logger by giving Gunicorn a Python path to a + class that quacks like ``gunicorn.glogging.Logger``. + """ + + +class LogConfig(Setting): + name = "logconfig" + section = "Logging" + cli = ["--log-config"] + meta = "FILE" + validator = validate_string + default = None + desc = """\ + The log config file to use. + Gunicorn uses the standard Python logging module's Configuration + file format. + """ + + +class LogConfigDict(Setting): + name = "logconfig_dict" + section = "Logging" + validator = validate_dict + default = {} + desc = """\ + The log config dictionary to use, using the standard Python + logging module's dictionary configuration format. This option + takes precedence over the :ref:`logconfig` and :ref:`logconfig-json` options, + which uses the older file configuration format and JSON + respectively. + + Format: https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig + + For more context you can look at the default configuration dictionary for logging, + which can be found at ``gunicorn.glogging.CONFIG_DEFAULTS``. + + .. versionadded:: 19.8 + """ + + +class LogConfigJson(Setting): + name = "logconfig_json" + section = "Logging" + cli = ["--log-config-json"] + meta = "FILE" + validator = validate_string + default = None + desc = """\ + The log config to read config from a JSON file + + Format: https://docs.python.org/3/library/logging.config.html#logging.config.jsonConfig + + .. versionadded:: 20.0 + """ + + +class SyslogTo(Setting): + name = "syslog_addr" + section = "Logging" + cli = ["--log-syslog-to"] + meta = "SYSLOG_ADDR" + validator = validate_string + + if PLATFORM == "darwin": + default = "unix:///var/run/syslog" + elif PLATFORM in ('freebsd', 'dragonfly', ): + default = "unix:///var/run/log" + elif PLATFORM == "openbsd": + default = "unix:///dev/log" + else: + default = "udp://localhost:514" + + desc = """\ + Address to send syslog messages. + + Address is a string of the form: + + * ``unix://PATH#TYPE`` : for unix domain socket. ``TYPE`` can be ``stream`` + for the stream driver or ``dgram`` for the dgram driver. + ``stream`` is the default. + * ``udp://HOST:PORT`` : for UDP sockets + * ``tcp://HOST:PORT`` : for TCP sockets + + """ + + +class Syslog(Setting): + name = "syslog" + section = "Logging" + cli = ["--log-syslog"] + validator = validate_bool + action = 'store_true' + default = False + desc = """\ + Send *Gunicorn* logs to syslog. + + .. versionchanged:: 19.8 + You can now disable sending access logs by using the + :ref:`disable-redirect-access-to-syslog` setting. + """ + + +class SyslogPrefix(Setting): + name = "syslog_prefix" + section = "Logging" + cli = ["--log-syslog-prefix"] + meta = "SYSLOG_PREFIX" + validator = validate_string + default = None + desc = """\ + Makes Gunicorn use the parameter as program-name in the syslog entries. + + All entries will be prefixed by ``gunicorn.``. By default the + program name is the name of the process. + """ + + +class SyslogFacility(Setting): + name = "syslog_facility" + section = "Logging" + cli = ["--log-syslog-facility"] + meta = "SYSLOG_FACILITY" + validator = validate_string + default = "user" + desc = """\ + Syslog facility name + """ + + +class EnableStdioInheritance(Setting): + name = "enable_stdio_inheritance" + section = "Logging" + cli = ["-R", "--enable-stdio-inheritance"] + validator = validate_bool + default = False + action = "store_true" + desc = """\ + Enable stdio inheritance. + + Enable inheritance for stdio file descriptors in daemon mode. + + Note: To disable the Python stdout buffering, you can to set the user + environment variable ``PYTHONUNBUFFERED`` . + """ + + +# statsD monitoring +class StatsdHost(Setting): + name = "statsd_host" + section = "Logging" + cli = ["--statsd-host"] + meta = "STATSD_ADDR" + default = None + validator = validate_statsd_address + desc = """\ + The address of the StatsD server to log to. + + Address is a string of the form: + + * ``unix://PATH`` : for a unix domain socket. + * ``HOST:PORT`` : for a network address + + .. versionadded:: 19.1 + """ + + +# Datadog Statsd (dogstatsd) tags. https://docs.datadoghq.com/developers/dogstatsd/ +class DogstatsdTags(Setting): + name = "dogstatsd_tags" + section = "Logging" + cli = ["--dogstatsd-tags"] + meta = "DOGSTATSD_TAGS" + default = "" + validator = validate_string + desc = """\ + A comma-delimited list of datadog statsd (dogstatsd) tags to append to + statsd metrics. + + .. versionadded:: 20 + """ + + +class StatsdPrefix(Setting): + name = "statsd_prefix" + section = "Logging" + cli = ["--statsd-prefix"] + meta = "STATSD_PREFIX" + default = "" + validator = validate_string + desc = """\ + Prefix to use when emitting statsd metrics (a trailing ``.`` is added, + if not provided). + + .. versionadded:: 19.2 + """ + + +class Procname(Setting): + name = "proc_name" + section = "Process Naming" + cli = ["-n", "--name"] + meta = "STRING" + validator = validate_string + default = None + desc = """\ + A base to use with setproctitle for process naming. + + This affects things like ``ps`` and ``top``. If you're going to be + running more than one instance of Gunicorn you'll probably want to set a + name to tell them apart. This requires that you install the setproctitle + module. + + If not set, the *default_proc_name* setting will be used. + """ + + +class DefaultProcName(Setting): + name = "default_proc_name" + section = "Process Naming" + validator = validate_string + default = "gunicorn" + desc = """\ + Internal setting that is adjusted for each type of application. + """ + + +class PythonPath(Setting): + name = "pythonpath" + section = "Server Mechanics" + cli = ["--pythonpath"] + meta = "STRING" + validator = validate_string + default = None + desc = """\ + A comma-separated list of directories to add to the Python path. + + e.g. + ``'/home/djangoprojects/myproject,/home/python/mylibrary'``. + """ + + +class Paste(Setting): + name = "paste" + section = "Server Mechanics" + cli = ["--paste", "--paster"] + meta = "STRING" + validator = validate_string + default = None + desc = """\ + Load a PasteDeploy config file. The argument may contain a ``#`` + symbol followed by the name of an app section from the config file, + e.g. ``production.ini#admin``. + + At this time, using alternate server blocks is not supported. Use the + command line arguments to control server configuration instead. + """ + + +class OnStarting(Setting): + name = "on_starting" + section = "Server Hooks" + validator = validate_callable(1) + type = callable + + def on_starting(server): + pass + default = staticmethod(on_starting) + desc = """\ + Called just before the master process is initialized. + + The callable needs to accept a single instance variable for the Arbiter. + """ + + +class OnReload(Setting): + name = "on_reload" + section = "Server Hooks" + validator = validate_callable(1) + type = callable + + def on_reload(server): + pass + default = staticmethod(on_reload) + desc = """\ + Called to recycle workers during a reload via SIGHUP. + + The callable needs to accept a single instance variable for the Arbiter. + """ + + +class WhenReady(Setting): + name = "when_ready" + section = "Server Hooks" + validator = validate_callable(1) + type = callable + + def when_ready(server): + pass + default = staticmethod(when_ready) + desc = """\ + Called just after the server is started. + + The callable needs to accept a single instance variable for the Arbiter. + """ + + +class Prefork(Setting): + name = "pre_fork" + section = "Server Hooks" + validator = validate_callable(2) + type = callable + + def pre_fork(server, worker): + pass + default = staticmethod(pre_fork) + desc = """\ + Called just before a worker is forked. + + The callable needs to accept two instance variables for the Arbiter and + new Worker. + """ + + +class Postfork(Setting): + name = "post_fork" + section = "Server Hooks" + validator = validate_callable(2) + type = callable + + def post_fork(server, worker): + pass + default = staticmethod(post_fork) + desc = """\ + Called just after a worker has been forked. + + The callable needs to accept two instance variables for the Arbiter and + new Worker. + """ + + +class PostWorkerInit(Setting): + name = "post_worker_init" + section = "Server Hooks" + validator = validate_callable(1) + type = callable + + def post_worker_init(worker): + pass + + default = staticmethod(post_worker_init) + desc = """\ + Called just after a worker has initialized the application. + + The callable needs to accept one instance variable for the initialized + Worker. + """ + + +class WorkerInt(Setting): + name = "worker_int" + section = "Server Hooks" + validator = validate_callable(1) + type = callable + + def worker_int(worker): + pass + + default = staticmethod(worker_int) + desc = """\ + Called just after a worker exited on SIGINT or SIGQUIT. + + The callable needs to accept one instance variable for the initialized + Worker. + """ + + +class WorkerAbort(Setting): + name = "worker_abort" + section = "Server Hooks" + validator = validate_callable(1) + type = callable + + def worker_abort(worker): + pass + + default = staticmethod(worker_abort) + desc = """\ + Called when a worker received the SIGABRT signal. + + This call generally happens on timeout. + + The callable needs to accept one instance variable for the initialized + Worker. + """ + + +class PreExec(Setting): + name = "pre_exec" + section = "Server Hooks" + validator = validate_callable(1) + type = callable + + def pre_exec(server): + pass + default = staticmethod(pre_exec) + desc = """\ + Called just before a new master process is forked. + + The callable needs to accept a single instance variable for the Arbiter. + """ + + +class PreRequest(Setting): + name = "pre_request" + section = "Server Hooks" + validator = validate_callable(2) + type = callable + + def pre_request(worker, req): + worker.log.debug("%s %s", req.method, req.path) + default = staticmethod(pre_request) + desc = """\ + Called just before a worker processes the request. + + The callable needs to accept two instance variables for the Worker and + the Request. + """ + + +class PostRequest(Setting): + name = "post_request" + section = "Server Hooks" + validator = validate_post_request + type = callable + + def post_request(worker, req, environ, resp): + pass + default = staticmethod(post_request) + desc = """\ + Called after a worker processes the request. + + The callable needs to accept two instance variables for the Worker and + the Request. + """ + + +class ChildExit(Setting): + name = "child_exit" + section = "Server Hooks" + validator = validate_callable(2) + type = callable + + def child_exit(server, worker): + pass + default = staticmethod(child_exit) + desc = """\ + Called just after a worker has been exited, in the master process. + + The callable needs to accept two instance variables for the Arbiter and + the just-exited Worker. + + .. versionadded:: 19.7 + """ + + +class WorkerExit(Setting): + name = "worker_exit" + section = "Server Hooks" + validator = validate_callable(2) + type = callable + + def worker_exit(server, worker): + pass + default = staticmethod(worker_exit) + desc = """\ + Called just after a worker has been exited, in the worker process. + + The callable needs to accept two instance variables for the Arbiter and + the just-exited Worker. + """ + + +class NumWorkersChanged(Setting): + name = "nworkers_changed" + section = "Server Hooks" + validator = validate_callable(3) + type = callable + + def nworkers_changed(server, new_value, old_value): + pass + default = staticmethod(nworkers_changed) + desc = """\ + Called just after *num_workers* has been changed. + + The callable needs to accept an instance variable of the Arbiter and + two integers of number of workers after and before change. + + If the number of workers is set for the first time, *old_value* would + be ``None``. + """ + + +class OnExit(Setting): + name = "on_exit" + section = "Server Hooks" + validator = validate_callable(1) + + def on_exit(server): + pass + + default = staticmethod(on_exit) + desc = """\ + Called just before exiting Gunicorn. + + The callable needs to accept a single instance variable for the Arbiter. + """ + + +class NewSSLContext(Setting): + name = "ssl_context" + section = "Server Hooks" + validator = validate_callable(2) + type = callable + + def ssl_context(config, default_ssl_context_factory): + return default_ssl_context_factory() + + default = staticmethod(ssl_context) + desc = """\ + Called when SSLContext is needed. + + Allows customizing SSL context. + + The callable needs to accept an instance variable for the Config and + a factory function that returns default SSLContext which is initialized + with certificates, private key, cert_reqs, and ciphers according to + config and can be further customized by the callable. + The callable needs to return SSLContext object. + + Following example shows a configuration file that sets the minimum TLS version to 1.3: + + .. code-block:: python + + def ssl_context(conf, default_ssl_context_factory): + import ssl + context = default_ssl_context_factory() + context.minimum_version = ssl.TLSVersion.TLSv1_3 + return context + + .. versionadded:: 21.0 + """ + + +class ProxyProtocol(Setting): + name = "proxy_protocol" + section = "Server Mechanics" + cli = ["--proxy-protocol"] + validator = validate_bool + default = False + action = "store_true" + desc = """\ + Enable detect PROXY protocol (PROXY mode). + + Allow using HTTP and Proxy together. It may be useful for work with + stunnel as HTTPS frontend and Gunicorn as HTTP server. + + PROXY protocol: http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt + + Example for stunnel config:: + + [https] + protocol = proxy + accept = 443 + connect = 80 + cert = /etc/ssl/certs/stunnel.pem + key = /etc/ssl/certs/stunnel.key + """ + + +class ProxyAllowFrom(Setting): + name = "proxy_allow_ips" + section = "Server Mechanics" + cli = ["--proxy-allow-from"] + validator = validate_string_to_addr_list + default = "127.0.0.1,::1" + desc = """\ + Front-end's IPs from which allowed accept proxy requests (comma separated). + + Set to ``*`` to disable checking of front-end IPs. This is useful for setups + where you don't know in advance the IP address of front-end, but + instead have ensured via other means that only your + authorized front-ends can access Gunicorn. + + .. note:: + + This option does not affect UNIX socket connections. Connections not associated with + an IP address are treated as allowed, unconditionally. + """ + + +class KeyFile(Setting): + name = "keyfile" + section = "SSL" + cli = ["--keyfile"] + meta = "FILE" + validator = validate_string + default = None + desc = """\ + SSL key file + """ + + +class CertFile(Setting): + name = "certfile" + section = "SSL" + cli = ["--certfile"] + meta = "FILE" + validator = validate_string + default = None + desc = """\ + SSL certificate file + """ + + +class SSLVersion(Setting): + name = "ssl_version" + section = "SSL" + cli = ["--ssl-version"] + validator = validate_ssl_version + + if hasattr(ssl, "PROTOCOL_TLS"): + default = ssl.PROTOCOL_TLS + else: + default = ssl.PROTOCOL_SSLv23 + + default = ssl.PROTOCOL_SSLv23 + desc = """\ + SSL version to use (see stdlib ssl module's). + + .. deprecated:: 21.0 + The option is deprecated and it is currently ignored. Use :ref:`ssl-context` instead. + + ============= ============ + --ssl-version Description + ============= ============ + SSLv3 SSLv3 is not-secure and is strongly discouraged. + SSLv23 Alias for TLS. Deprecated in Python 3.6, use TLS. + TLS Negotiate highest possible version between client/server. + Can yield SSL. (Python 3.6+) + TLSv1 TLS 1.0 + TLSv1_1 TLS 1.1 (Python 3.4+) + TLSv1_2 TLS 1.2 (Python 3.4+) + TLS_SERVER Auto-negotiate the highest protocol version like TLS, + but only support server-side SSLSocket connections. + (Python 3.6+) + ============= ============ + + .. versionchanged:: 19.7 + The default value has been changed from ``ssl.PROTOCOL_TLSv1`` to + ``ssl.PROTOCOL_SSLv23``. + .. versionchanged:: 20.0 + This setting now accepts string names based on ``ssl.PROTOCOL_`` + constants. + .. versionchanged:: 20.0.1 + The default value has been changed from ``ssl.PROTOCOL_SSLv23`` to + ``ssl.PROTOCOL_TLS`` when Python >= 3.6 . + """ + + +class CertReqs(Setting): + name = "cert_reqs" + section = "SSL" + cli = ["--cert-reqs"] + validator = validate_pos_int + default = ssl.CERT_NONE + desc = """\ + Whether client certificate is required (see stdlib ssl module's) + + =========== =========================== + --cert-reqs Description + =========== =========================== + `0` no client verification + `1` ssl.CERT_OPTIONAL + `2` ssl.CERT_REQUIRED + =========== =========================== + """ + + +class CACerts(Setting): + name = "ca_certs" + section = "SSL" + cli = ["--ca-certs"] + meta = "FILE" + validator = validate_string + default = None + desc = """\ + CA certificates file + """ + + +class SuppressRaggedEOFs(Setting): + name = "suppress_ragged_eofs" + section = "SSL" + cli = ["--suppress-ragged-eofs"] + action = "store_true" + default = True + validator = validate_bool + desc = """\ + Suppress ragged EOFs (see stdlib ssl module's) + """ + + +class DoHandshakeOnConnect(Setting): + name = "do_handshake_on_connect" + section = "SSL" + cli = ["--do-handshake-on-connect"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Whether to perform SSL handshake on socket connect (see stdlib ssl module's) + """ + + +class Ciphers(Setting): + name = "ciphers" + section = "SSL" + cli = ["--ciphers"] + validator = validate_string + default = None + desc = """\ + SSL Cipher suite to use, in the format of an OpenSSL cipher list. + + By default we use the default cipher list from Python's ``ssl`` module, + which contains ciphers considered strong at the time of each Python + release. + + As a recommended alternative, the Open Web App Security Project (OWASP) + offers `a vetted set of strong cipher strings rated A+ to C- + `_. + OWASP provides details on user-agent compatibility at each security level. + + See the `OpenSSL Cipher List Format Documentation + `_ + for details on the format of an OpenSSL cipher list. + """ + + +class PasteGlobalConf(Setting): + name = "raw_paste_global_conf" + action = "append" + section = "Server Mechanics" + cli = ["--paste-global"] + meta = "CONF" + validator = validate_list_string + default = [] + + desc = """\ + Set a PasteDeploy global config variable in ``key=value`` form. + + The option can be specified multiple times. + + The variables are passed to the PasteDeploy entrypoint. Example:: + + $ gunicorn -b 127.0.0.1:8000 --paste development.ini --paste-global FOO=1 --paste-global BAR=2 + + .. versionadded:: 19.7 + """ + + +class PermitObsoleteFolding(Setting): + name = "permit_obsolete_folding" + section = "Server Mechanics" + cli = ["--permit-obsolete-folding"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Permit requests employing obsolete HTTP line folding mechanism + + The folding mechanism was deprecated by rfc7230 Section 3.2.4 and will not be + employed in HTTP request headers from standards-compliant HTTP clients. + + This option is provided to diagnose backwards-incompatible changes. + Use with care and only if necessary. Temporary; the precise effect of this option may + change in a future version, or it may be removed altogether. + + .. versionadded:: 23.0.0 + """ + + +class StripHeaderSpaces(Setting): + name = "strip_header_spaces" + section = "Server Mechanics" + cli = ["--strip-header-spaces"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Strip spaces present between the header name and the the ``:``. + + This is known to induce vulnerabilities and is not compliant with the HTTP/1.1 standard. + See https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn. + + Use with care and only if necessary. Deprecated; scheduled for removal in 25.0.0 + + .. versionadded:: 20.0.1 + """ + + +class PermitUnconventionalHTTPMethod(Setting): + name = "permit_unconventional_http_method" + section = "Server Mechanics" + cli = ["--permit-unconventional-http-method"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Permit HTTP methods not matching conventions, such as IANA registration guidelines + + This permits request methods of length less than 3 or more than 20, + methods with lowercase characters or methods containing the # character. + HTTP methods are case sensitive by definition, and merely uppercase by convention. + + If unset, Gunicorn will apply nonstandard restrictions and cause 400 response status + in cases where otherwise 501 status is expected. While this option does modify that + behaviour, it should not be depended upon to guarantee standards-compliant behaviour. + Rather, it is provided temporarily, to assist in diagnosing backwards-incompatible + changes around the incomplete application of those restrictions. + + Use with care and only if necessary. Temporary; scheduled for removal in 24.0.0 + + .. versionadded:: 22.0.0 + """ + + +class PermitUnconventionalHTTPVersion(Setting): + name = "permit_unconventional_http_version" + section = "Server Mechanics" + cli = ["--permit-unconventional-http-version"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Permit HTTP version not matching conventions of 2023 + + This disables the refusal of likely malformed request lines. + It is unusual to specify HTTP 1 versions other than 1.0 and 1.1. + + This option is provided to diagnose backwards-incompatible changes. + Use with care and only if necessary. Temporary; the precise effect of this option may + change in a future version, or it may be removed altogether. + + .. versionadded:: 22.0.0 + """ + + +class CasefoldHTTPMethod(Setting): + name = "casefold_http_method" + section = "Server Mechanics" + cli = ["--casefold-http-method"] + validator = validate_bool + action = "store_true" + default = False + desc = """\ + Transform received HTTP methods to uppercase + + HTTP methods are case sensitive by definition, and merely uppercase by convention. + + This option is provided because previous versions of gunicorn defaulted to this behaviour. + + Use with care and only if necessary. Deprecated; scheduled for removal in 24.0.0 + + .. versionadded:: 22.0.0 + """ + + +def validate_header_map_behaviour(val): + # FIXME: refactor all of this subclassing stdlib argparse + + if val is None: + return + + if not isinstance(val, str): + raise TypeError("Invalid type for casting: %s" % val) + if val.lower().strip() == "drop": + return "drop" + elif val.lower().strip() == "refuse": + return "refuse" + elif val.lower().strip() == "dangerous": + return "dangerous" + else: + raise ValueError("Invalid header map behaviour: %s" % val) + + +class ForwarderHeaders(Setting): + name = "forwarder_headers" + section = "Server Mechanics" + cli = ["--forwarder-headers"] + validator = validate_string_to_list + default = "SCRIPT_NAME,PATH_INFO" + desc = """\ + + A list containing upper-case header field names that the front-end proxy + (see :ref:`forwarded-allow-ips`) sets, to be used in WSGI environment. + + This option has no effect for headers not present in the request. + + This option can be used to transfer ``SCRIPT_NAME``, ``PATH_INFO`` + and ``REMOTE_USER``. + + It is important that your front-end proxy configuration ensures that + the headers defined here can not be passed directly from the client. + """ + + +class HeaderMap(Setting): + name = "header_map" + section = "Server Mechanics" + cli = ["--header-map"] + validator = validate_header_map_behaviour + default = "drop" + desc = """\ + Configure how header field names are mapped into environ + + Headers containing underscores are permitted by RFC9110, + but gunicorn joining headers of different names into + the same environment variable will dangerously confuse applications as to which is which. + + The safe default ``drop`` is to silently drop headers that cannot be unambiguously mapped. + The value ``refuse`` will return an error if a request contains *any* such header. + The value ``dangerous`` matches the previous, not advisable, behaviour of mapping different + header field names into the same environ name. + + If the source is permitted as explained in :ref:`forwarded-allow-ips`, *and* the header name is + present in :ref:`forwarder-headers`, the header is mapped into environment regardless of + the state of this setting. + + Use with care and only if necessary and after considering if your problem could + instead be solved by specifically renaming or rewriting only the intended headers + on a proxy in front of Gunicorn. + + .. versionadded:: 22.0.0 + """ diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/debug.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/debug.py new file mode 100644 index 00000000..5fae0b4d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/debug.py @@ -0,0 +1,68 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +"""The debug module contains utilities and functions for better +debugging Gunicorn.""" + +import sys +import linecache +import re +import inspect + +__all__ = ['spew', 'unspew'] + +_token_spliter = re.compile(r'\W+') + + +class Spew: + + def __init__(self, trace_names=None, show_values=True): + self.trace_names = trace_names + self.show_values = show_values + + def __call__(self, frame, event, arg): + if event == 'line': + lineno = frame.f_lineno + if '__file__' in frame.f_globals: + filename = frame.f_globals['__file__'] + if (filename.endswith('.pyc') or + filename.endswith('.pyo')): + filename = filename[:-1] + name = frame.f_globals['__name__'] + line = linecache.getline(filename, lineno) + else: + name = '[unknown]' + try: + src = inspect.getsourcelines(frame) + line = src[lineno] + except OSError: + line = 'Unknown code named [%s]. VM instruction #%d' % ( + frame.f_code.co_name, frame.f_lasti) + if self.trace_names is None or name in self.trace_names: + print('%s:%s: %s' % (name, lineno, line.rstrip())) + if not self.show_values: + return self + details = [] + tokens = _token_spliter.split(line) + for tok in tokens: + if tok in frame.f_globals: + details.append('%s=%r' % (tok, frame.f_globals[tok])) + if tok in frame.f_locals: + details.append('%s=%r' % (tok, frame.f_locals[tok])) + if details: + print("\t%s" % ' '.join(details)) + return self + + +def spew(trace_names=None, show_values=False): + """Install a trace hook which writes incredibly detailed logs + about what code is being executed to stdout. + """ + sys.settrace(Spew(trace_names, show_values)) + + +def unspew(): + """Remove the trace hook installed by spew. + """ + sys.settrace(None) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/errors.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/errors.py new file mode 100644 index 00000000..11283808 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/errors.py @@ -0,0 +1,28 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# We don't need to call super() in __init__ methods of our +# BaseException and Exception classes because we also define +# our own __str__ methods so there is no need to pass 'message' +# to the base class to get a meaningful output from 'str(exc)'. +# pylint: disable=super-init-not-called + + +# we inherit from BaseException here to make sure to not be caught +# at application level +class HaltServer(BaseException): + def __init__(self, reason, exit_status=1): + self.reason = reason + self.exit_status = exit_status + + def __str__(self): + return "" % (self.reason, self.exit_status) + + +class ConfigError(Exception): + """ Exception raised on config error """ + + +class AppImportError(Exception): + """ Exception raised when loading an application """ diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/glogging.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/glogging.py new file mode 100644 index 00000000..e34fcd5f --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/glogging.py @@ -0,0 +1,473 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import base64 +import binascii +import json +import time +import logging +logging.Logger.manager.emittedNoHandlerWarning = 1 # noqa +from logging.config import dictConfig +from logging.config import fileConfig +import os +import socket +import sys +import threading +import traceback + +from gunicorn import util + + +# syslog facility codes +SYSLOG_FACILITIES = { + "auth": 4, + "authpriv": 10, + "cron": 9, + "daemon": 3, + "ftp": 11, + "kern": 0, + "lpr": 6, + "mail": 2, + "news": 7, + "security": 4, # DEPRECATED + "syslog": 5, + "user": 1, + "uucp": 8, + "local0": 16, + "local1": 17, + "local2": 18, + "local3": 19, + "local4": 20, + "local5": 21, + "local6": 22, + "local7": 23 +} + +CONFIG_DEFAULTS = { + "version": 1, + "disable_existing_loggers": False, + "root": {"level": "INFO", "handlers": ["console"]}, + "loggers": { + "gunicorn.error": { + "level": "INFO", + "handlers": ["error_console"], + "propagate": True, + "qualname": "gunicorn.error" + }, + + "gunicorn.access": { + "level": "INFO", + "handlers": ["console"], + "propagate": True, + "qualname": "gunicorn.access" + } + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "formatter": "generic", + "stream": "ext://sys.stdout" + }, + "error_console": { + "class": "logging.StreamHandler", + "formatter": "generic", + "stream": "ext://sys.stderr" + }, + }, + "formatters": { + "generic": { + "format": "%(asctime)s [%(process)d] [%(levelname)s] %(message)s", + "datefmt": "[%Y-%m-%d %H:%M:%S %z]", + "class": "logging.Formatter" + } + } +} + + +def loggers(): + """ get list of all loggers """ + root = logging.root + existing = list(root.manager.loggerDict.keys()) + return [logging.getLogger(name) for name in existing] + + +class SafeAtoms(dict): + + def __init__(self, atoms): + dict.__init__(self) + for key, value in atoms.items(): + if isinstance(value, str): + self[key] = value.replace('"', '\\"') + else: + self[key] = value + + def __getitem__(self, k): + if k.startswith("{"): + kl = k.lower() + if kl in self: + return super().__getitem__(kl) + else: + return "-" + if k in self: + return super().__getitem__(k) + else: + return '-' + + +def parse_syslog_address(addr): + + # unix domain socket type depends on backend + # SysLogHandler will try both when given None + if addr.startswith("unix://"): + sock_type = None + + # set socket type only if explicitly requested + parts = addr.split("#", 1) + if len(parts) == 2: + addr = parts[0] + if parts[1] == "dgram": + sock_type = socket.SOCK_DGRAM + + return (sock_type, addr.split("unix://")[1]) + + if addr.startswith("udp://"): + addr = addr.split("udp://")[1] + socktype = socket.SOCK_DGRAM + elif addr.startswith("tcp://"): + addr = addr.split("tcp://")[1] + socktype = socket.SOCK_STREAM + else: + raise RuntimeError("invalid syslog address") + + if '[' in addr and ']' in addr: + host = addr.split(']')[0][1:].lower() + elif ':' in addr: + host = addr.split(':')[0].lower() + elif addr == "": + host = "localhost" + else: + host = addr.lower() + + addr = addr.split(']')[-1] + if ":" in addr: + port = addr.split(':', 1)[1] + if not port.isdigit(): + raise RuntimeError("%r is not a valid port number." % port) + port = int(port) + else: + port = 514 + + return (socktype, (host, port)) + + +class Logger: + + LOG_LEVELS = { + "critical": logging.CRITICAL, + "error": logging.ERROR, + "warning": logging.WARNING, + "info": logging.INFO, + "debug": logging.DEBUG + } + loglevel = logging.INFO + + error_fmt = r"%(asctime)s [%(process)d] [%(levelname)s] %(message)s" + datefmt = r"[%Y-%m-%d %H:%M:%S %z]" + + access_fmt = "%(message)s" + syslog_fmt = "[%(process)d] %(message)s" + + atoms_wrapper_class = SafeAtoms + + def __init__(self, cfg): + self.error_log = logging.getLogger("gunicorn.error") + self.error_log.propagate = False + self.access_log = logging.getLogger("gunicorn.access") + self.access_log.propagate = False + self.error_handlers = [] + self.access_handlers = [] + self.logfile = None + self.lock = threading.Lock() + self.cfg = cfg + self.setup(cfg) + + def setup(self, cfg): + self.loglevel = self.LOG_LEVELS.get(cfg.loglevel.lower(), logging.INFO) + self.error_log.setLevel(self.loglevel) + self.access_log.setLevel(logging.INFO) + + # set gunicorn.error handler + if self.cfg.capture_output and cfg.errorlog != "-": + for stream in sys.stdout, sys.stderr: + stream.flush() + + self.logfile = open(cfg.errorlog, 'a+') + os.dup2(self.logfile.fileno(), sys.stdout.fileno()) + os.dup2(self.logfile.fileno(), sys.stderr.fileno()) + + self._set_handler(self.error_log, cfg.errorlog, + logging.Formatter(self.error_fmt, self.datefmt)) + + # set gunicorn.access handler + if cfg.accesslog is not None: + self._set_handler( + self.access_log, cfg.accesslog, + fmt=logging.Formatter(self.access_fmt), stream=sys.stdout + ) + + # set syslog handler + if cfg.syslog: + self._set_syslog_handler( + self.error_log, cfg, self.syslog_fmt, "error" + ) + if not cfg.disable_redirect_access_to_syslog: + self._set_syslog_handler( + self.access_log, cfg, self.syslog_fmt, "access" + ) + + if cfg.logconfig_dict: + config = CONFIG_DEFAULTS.copy() + config.update(cfg.logconfig_dict) + try: + dictConfig(config) + except ( + AttributeError, + ImportError, + ValueError, + TypeError + ) as exc: + raise RuntimeError(str(exc)) + elif cfg.logconfig_json: + config = CONFIG_DEFAULTS.copy() + if os.path.exists(cfg.logconfig_json): + try: + config_json = json.load(open(cfg.logconfig_json)) + config.update(config_json) + dictConfig(config) + except ( + json.JSONDecodeError, + AttributeError, + ImportError, + ValueError, + TypeError + ) as exc: + raise RuntimeError(str(exc)) + elif cfg.logconfig: + if os.path.exists(cfg.logconfig): + defaults = CONFIG_DEFAULTS.copy() + defaults['__file__'] = cfg.logconfig + defaults['here'] = os.path.dirname(cfg.logconfig) + fileConfig(cfg.logconfig, defaults=defaults, + disable_existing_loggers=False) + else: + msg = "Error: log config '%s' not found" + raise RuntimeError(msg % cfg.logconfig) + + def critical(self, msg, *args, **kwargs): + self.error_log.critical(msg, *args, **kwargs) + + def error(self, msg, *args, **kwargs): + self.error_log.error(msg, *args, **kwargs) + + def warning(self, msg, *args, **kwargs): + self.error_log.warning(msg, *args, **kwargs) + + def info(self, msg, *args, **kwargs): + self.error_log.info(msg, *args, **kwargs) + + def debug(self, msg, *args, **kwargs): + self.error_log.debug(msg, *args, **kwargs) + + def exception(self, msg, *args, **kwargs): + self.error_log.exception(msg, *args, **kwargs) + + def log(self, lvl, msg, *args, **kwargs): + if isinstance(lvl, str): + lvl = self.LOG_LEVELS.get(lvl.lower(), logging.INFO) + self.error_log.log(lvl, msg, *args, **kwargs) + + def atoms(self, resp, req, environ, request_time): + """ Gets atoms for log formatting. + """ + status = resp.status + if isinstance(status, str): + status = status.split(None, 1)[0] + atoms = { + 'h': environ.get('REMOTE_ADDR', '-'), + 'l': '-', + 'u': self._get_user(environ) or '-', + 't': self.now(), + 'r': "%s %s %s" % (environ['REQUEST_METHOD'], + environ['RAW_URI'], + environ["SERVER_PROTOCOL"]), + 's': status, + 'm': environ.get('REQUEST_METHOD'), + 'U': environ.get('PATH_INFO'), + 'q': environ.get('QUERY_STRING'), + 'H': environ.get('SERVER_PROTOCOL'), + 'b': getattr(resp, 'sent', None) is not None and str(resp.sent) or '-', + 'B': getattr(resp, 'sent', None), + 'f': environ.get('HTTP_REFERER', '-'), + 'a': environ.get('HTTP_USER_AGENT', '-'), + 'T': request_time.seconds, + 'D': (request_time.seconds * 1000000) + request_time.microseconds, + 'M': (request_time.seconds * 1000) + int(request_time.microseconds / 1000), + 'L': "%d.%06d" % (request_time.seconds, request_time.microseconds), + 'p': "<%s>" % os.getpid() + } + + # add request headers + if hasattr(req, 'headers'): + req_headers = req.headers + else: + req_headers = req + + if hasattr(req_headers, "items"): + req_headers = req_headers.items() + + atoms.update({"{%s}i" % k.lower(): v for k, v in req_headers}) + + resp_headers = resp.headers + if hasattr(resp_headers, "items"): + resp_headers = resp_headers.items() + + # add response headers + atoms.update({"{%s}o" % k.lower(): v for k, v in resp_headers}) + + # add environ variables + environ_variables = environ.items() + atoms.update({"{%s}e" % k.lower(): v for k, v in environ_variables}) + + return atoms + + def access(self, resp, req, environ, request_time): + """ See http://httpd.apache.org/docs/2.0/logs.html#combined + for format details + """ + + if not (self.cfg.accesslog or self.cfg.logconfig or + self.cfg.logconfig_dict or self.cfg.logconfig_json or + (self.cfg.syslog and not self.cfg.disable_redirect_access_to_syslog)): + return + + # wrap atoms: + # - make sure atoms will be test case insensitively + # - if atom doesn't exist replace it by '-' + safe_atoms = self.atoms_wrapper_class( + self.atoms(resp, req, environ, request_time) + ) + + try: + self.access_log.info(self.cfg.access_log_format, safe_atoms) + except Exception: + self.error(traceback.format_exc()) + + def now(self): + """ return date in Apache Common Log Format """ + return time.strftime('[%d/%b/%Y:%H:%M:%S %z]') + + def reopen_files(self): + if self.cfg.capture_output and self.cfg.errorlog != "-": + for stream in sys.stdout, sys.stderr: + stream.flush() + + with self.lock: + if self.logfile is not None: + self.logfile.close() + self.logfile = open(self.cfg.errorlog, 'a+') + os.dup2(self.logfile.fileno(), sys.stdout.fileno()) + os.dup2(self.logfile.fileno(), sys.stderr.fileno()) + + for log in loggers(): + for handler in log.handlers: + if isinstance(handler, logging.FileHandler): + handler.acquire() + try: + if handler.stream: + handler.close() + handler.stream = handler._open() + finally: + handler.release() + + def close_on_exec(self): + for log in loggers(): + for handler in log.handlers: + if isinstance(handler, logging.FileHandler): + handler.acquire() + try: + if handler.stream: + util.close_on_exec(handler.stream.fileno()) + finally: + handler.release() + + def _get_gunicorn_handler(self, log): + for h in log.handlers: + if getattr(h, "_gunicorn", False): + return h + + def _set_handler(self, log, output, fmt, stream=None): + # remove previous gunicorn log handler + h = self._get_gunicorn_handler(log) + if h: + log.handlers.remove(h) + + if output is not None: + if output == "-": + h = logging.StreamHandler(stream) + else: + util.check_is_writable(output) + h = logging.FileHandler(output) + # make sure the user can reopen the file + try: + os.chown(h.baseFilename, self.cfg.user, self.cfg.group) + except OSError: + # it's probably OK there, we assume the user has given + # /dev/null as a parameter. + pass + + h.setFormatter(fmt) + h._gunicorn = True + log.addHandler(h) + + def _set_syslog_handler(self, log, cfg, fmt, name): + # setup format + prefix = cfg.syslog_prefix or cfg.proc_name.replace(":", ".") + + prefix = "gunicorn.%s.%s" % (prefix, name) + + # set format + fmt = logging.Formatter(r"%s: %s" % (prefix, fmt)) + + # syslog facility + try: + facility = SYSLOG_FACILITIES[cfg.syslog_facility.lower()] + except KeyError: + raise RuntimeError("unknown facility name") + + # parse syslog address + socktype, addr = parse_syslog_address(cfg.syslog_addr) + + # finally setup the syslog handler + h = logging.handlers.SysLogHandler(address=addr, + facility=facility, socktype=socktype) + + h.setFormatter(fmt) + h._gunicorn = True + log.addHandler(h) + + def _get_user(self, environ): + user = None + http_auth = environ.get("HTTP_AUTHORIZATION") + if http_auth and http_auth.lower().startswith('basic'): + auth = http_auth.split(" ", 1) + if len(auth) == 2: + try: + # b64decode doesn't accept unicode in Python < 3.3 + # so we need to convert it to a byte string + auth = base64.b64decode(auth[1].strip().encode('utf-8')) + # b64decode returns a byte string + user = auth.split(b":", 1)[0].decode("UTF-8") + except (TypeError, binascii.Error, UnicodeDecodeError) as exc: + self.debug("Couldn't get username: %s", exc) + return user diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__init__.py new file mode 100644 index 00000000..11473bb0 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__init__.py @@ -0,0 +1,8 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +from gunicorn.http.message import Message, Request +from gunicorn.http.parser import RequestParser + +__all__ = ['Message', 'Request', 'RequestParser'] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca56539d8e1cc48ec442052bc040be2fafbb3a00 GIT binary patch literal 371 zcmY*VyH3L}6t(jpC~6i2|3C&}g|2{v#L}S%Ay~3lrm+%J$4PCcQrP$kb~e6+Kd{6? zCpM%GNL|1wtq@o8x#vpfo@4tpib7!PbTKHuZC~`mwww)F9$NAQa*#s~Dwx5_$sE|v z4tFar^B^cd?molJ@4VRm=+|P$1Y@ccDX0mq>8zzn$IwI@dPSt7GIphFwbJXsw{RKn zn1iAfY*I^+lv+1Q^=tAcH2ePr&Dv_cZUT%6=NP|$rF8?V9NpR&h3J$BRo*j^6OKls zn=u-nU!-W(vWJQ&O(mLBF-M%;p{CPiErv;Yj1<%Ks3DW7eS|{WRMcM!Vax>67$;4) l+C8c2yyf&v4s0m2N9|eobRmRaA%Md-ki3WKV<7v#{sFi)XQTiC literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/body.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/body.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b26f6ff01847d8cc26184167ccec28d5ae711f5 GIT binary patch literal 12422 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/message.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/message.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ada88f4552dd58023dcd71032c1e736567e09040 GIT binary patch literal 17693 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/parser.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62a152f2a37a49fb8226fd0cdbc697ac9ac6455c GIT binary patch literal 2156 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/wsgi.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..218ad70c4d5ed82c8393bbe809abfb821ae92993 GIT binary patch literal 15728 zcmbt*eQ+Dsb?+{|KNbW*fCNC0AowK-lK3G@a%4%4LyM$7C_xHISrTmrrLZ6g5(KDS zP!bVvOsAfPbmS4)bV{gJDyVixblsUMoqj0O=_F}8X{PNT1VI_dhMh94-<$D&5~Z1@ zdNVKYoV(Zs2toGidw0l-z4xB`vG<;P&hMOi_n%EB0|nvL|6s<9FHzKgU_uJ&{KFGB zO;O7fOR;pA8WMl$A)2HWLkjY%98!{B)sPB)6=C(HW=KOLtum~g)D7t-^+Wne!;pdG zslvudW{8fz=}REE$9Z%_VxJu{XJf#U^^C#jD$v~x#3tS8ac;BFNcGZg6U-B>To#3 zo(K-JK~Au2OZtW-yJ%Z(Tps2@fM9Z|@F>uOY_yx2K-eLVB4BQn+@oZYq|3kA`(qz?dyhWNw&pPxr+P%HRXP0s2R$u@CoWbILZgTDnT~_!wH8bf`ayPc!Ceb;bCl;ACAR1&IC=s z46FEHc!aBf1ZReb$HqJ!&$Hj^IL`+;z9Tp>9O1{tLlJg3+;Q^c;F*pyUETXSu1tsG zlf!&0$aP!|My_^*Lzg?IW@2N}$o}?yFLm&tSg>tsI506h8ss}hrz4?2l#6tX#bQ$( z*Z9#;`_zn}^ZP@QP|WX-+lpqbUCOP;(d>q3j>hH-fU3nf5_OI8x3y)mmu zC^+~Zpknfpe24yo_IXugDg_k>tVt$RFr19A!RtL77v;Q4&H^n8%8B5Npkjw(!_stf zRhVz|`$vN@n7T=r6#Mo`kqerElHUap%!}E2b9P}iYi>-N8&fU!_TJr_F?YEW(3LTVh}wIsxFR!A7fJyjBYmJcF#&jSWZGFbD=gE7I|Tj?@QQL4$HH!U{@$hR1e5ICESjG|II?E-dvf-M6rEBm zCgx9UTAW*yLf<~$wPCJVypr7Y(A=D>v@J7BOt!K)UD=%Kx_9F4iHDVKkJUg%n0}kc z(Zaw8qy8KoULaBhr<9K?Zg4H%&$6?wD~pD;p3&Wpk= zRfW3!iASS$iG)}jz&#}eTt>nggYZx+!xEG-24J_d6*CS0aApxXoNci1wBZCYcNNBZr`@5(i{Zn$sg@v&YV!_Ug%s3YzID zKtDl2bveq;2%5}opZSE=x^zB)|%z7EqyKLYDw|;uHU`>6YD>^e(L(H^UQ;;zp&o_=3myV zb)L!W^rcUf-K#43`UxCBLLPw^;O zL1h>#vc{&gv1zXRSAd1hmU%s>30K2vLr1!{GiP@t&!p|UH|({^11VG5)t<3;fR;%f zP1o$&sBtD+l8JQf-b_u~W1|K|iAEA72vnqi3rkk;b5)5bfmKSVBtv*sU9?u)OEfGs zt1XE0a$=;M=0|ZMfx}r{d65G6VwR%bf*G6D&l(bXR!M+tYr;@Y&`4NCianNGIh&=rv%~m7~AJRWi!dsGD(&9TRH1)~=VHk-S zDPq-9F9}7gMtYX|;xu59YuHMpjJ&#y7L6DZWLg{GGqi_Ff;6XcJI;iHwcwbgoS0pz z0wq<&I}|9aC8Jc98RZ{?qC%)r5?GtGPP57w!WI$|N-3AEA}jDa2`$GbwErJ11k2Ac zTTR-pg3+PcF9~doG!EdR?iaLR|I!v5MJ+VHpch%4Lob%ErU7$IS{o;s`NG;LpIe(+ zq=1n(mAo1xXPJbK>r61?Xz-MTgiabaZ;9=c3Rzcz`B1^uC3GJuejuys@6ZXRXzk>h z#AIY*h`>o0NBCJ15{%Rj@KHS(s}7!M@}wDWDpIgTfUVeb@m$Zb!8o(8v$HJ_jl@Ec=^&4+OrXTR_I(~G@qiPLl$Z=A zgP=Nbb^vM|JL?MW zphv*oL@x^J%QLYc*w}1Pw72-Fa404y!@&r*2YXWCcm)F)B#(pSKuJ*?8X$soI&x(? z8VmYkQ9sU`AFvho8WvxI$ZH}hmpg%^8W9k{ID#BNF%fiuZ;PMe5J|y&M){avZ*@kx(Q;HL#pha4g3aZE(F^8j2ylNSZi|D_3l{Q<_qdr%yKfBttsfdO1I zS{IKcZAm_3Y@X`|^Umx}22uyW5~ygKI}VDSshsQHsIo2ZUfR9fzSN$ozpuzt?Vsy| zB2V+3Z{Pa%7FDfoOzT|px`PR%Yp^dL!(y!JYepq=V zXR1!tteF~e*1CmmOw_NLcI0ZC7y2;aUNh~??dX_4zUWIc%{j&fnX69kn#r5nwQv6T zs;wo>v_keH9c8Xb>avbqX$ROXD}jvTrF6wh^Gbjxi#r#-o@?H{vj3x_KXk4-j?ACT z**){xMdka%H2$wR6W;nfkQK{gk0}Rf{`rH?M2mxyGG9YFg8|H}uxU z-rGIv`XheQ}H|MM)6|Sv0+ok-#L&xsTA{v+)=+m@hN?u;CY|PbzSLN2Fx#RO^ z(yH2xdQYkb$Nu5B@;R`M7TdCJNjG=$7uu?v*^xCjr_If&zIAiwzgF$|cT4T9J}~Po z-X}_hb@wAmVcHEMNR)z&$$-*7c#UHj9n{r691TwjN_`_d{$u6~!) zi;hw=-}Sxg`@L6F){M1vU9}@;G%wocUtLv+PSgPKq#O{9V#s^+>phc7!$kn0uuJ6ZI8$|Wq;m%%MbA-pAl_({=NCxMj7mMv)og^E~)#~8AG zODK&}SwabAvTqbTkV;=K5zxi*hQo$AwD-|_I2@Y>aTyq!j!Xnu!7w?^$Nc1AgNq^s zlNX(S5ScN-j6w+|tsi9ID9ApPq#$3Xr$#wEBtka>_#qHv7UUbr<#85J6csriEt1@p zeUASGMEpgFz__s1fLBqMvpL{LzhSROA0wC#@MFx`>qx4$0e;MR|0B36=2h!DXRe_c zf9rC#YADr9wAkDSI?-2wju0uxYm7J+P7k-OF*)cN^wQh{6n;XJ7b|w77{P)H1jYG^ z+vL|N%FRJV9@h@us1^=ZJ}`gD5T24D0Oo<;(!ke3zO);P3dd!JDrA0|f8^+y7dTGl z7-&squtH6!@dC$KS(l1v?}&9|wkxy-mJW=VuYkVFm8!wUfVyxjsqqc=0%Ymw>i**A zQ2i6d7ykl3p-xyRua-={XrVIvSadqf<{9*RK*P;r)CCbJNW#p1)YaTg$SGPW?)M=b zua;M+xSd}jDGL!=wC0oF`fTgmGCwn-V; z#Jvx%3sOeO9R-JVStj82mS+OaQ#j5nXW#7(8#=D|#wckV9oh|D{GT8J`4)L5j(;5XOZ5;gXOjGChDoHZ%)l(k6hmipM3J zmIcZIaO>myOKx~@@}mcn1aR_`y8y)_0+)TCLF4$C{%RufB^9bUi9-TLy;JF4e6GV&hQ4JJh8|Oju~_r z`z2%x*wvpG;^LM-SFR+ANryz7>w?zcTu zh~}tY7_E;KDw79x$MTWiJ(4<*Z9cHpd|<=oSU$aUI^|etyz5#SyMN`Ai3f*%()FVw z>$c;Yu7)LD&Sbgy=E9q+rk0H=&uZg0GF4rxOxI=&ige>6gHqqJ(a@ASaPP?7BhX^H z`9P-m<@;CC&97t{4$pV5Gj)J!^roz?F0HGB^J!fxIGUE#Pb-Wr<_LQsfen>lg3lNH~TrB1t7_7!3r1K* zo=E-Y-EFV3TIfkW7l<5$`l2JQ^DFA>NH6sulkjM(B#bwfWIz&}V9JpqX|_n;Kq>$K zUb_zuD!qDNysDM+ghV@f7%XWH4w>VMRxYma=;IaWM*!^BmIrbMNJoMJ6h7PsFsea8 ze=T@fJcsaFxEN${y$}id!I>#h2ywU>1pUZ#I6OHV3yg87$OJQLakvrmM%U@{J#f8< z!)+s|vHK}*3ZA*!7<~^TBK}ZvjYX%XLi`x%ncz-hU+0gqMIfreI}?JMSh`@xW2)pp zg8M^gGwzTjSBZ%H-%!f8!Uh2~?`nEN)$2PJ`sTYATQ{urN%rGo>sIheH>`RN+>fO_ zM=~`>S1XTxj;GwMX=`hWUAOMpsM)!qT8VvP%+wrMtvv8K)C+z*ux|C{>rJOUM>93A zu2#PKxwR>4-J7=VT{*vQ-M>-Ooa$aVc=vRsX5VV%J~WzYm;09bQtFIt$9xY!+~reC zr@nt09?iB@$F4Q=u8p0$R}Ov@UsOG;Y}v3>FE=bTq-^V!9RMPdr`N2zHtluG-(LFm z_h(o1YxaG)oqLk1A27M<+GJ?0dM7~Me4%m8zCY)vyTjaKvW`7z$DWnJ`v+IftUC@r z24l~;?U+7gOHHRtpE2!^kHFM?2}=DKCh|pRDesDiQx<+enh)i!hrq=T*tU6;TCNUq zR7uGD*u{RzAXrvKP$fO122|P0y$sd4-^J+nAQ}XgBAj;|bI=4L(2?lZ=OE)9D2`iY zb}A@Xyl2RN6H4bO&_zt8j0_Rtfp)vNa4~DDPn+sf;N93+$h_%a@TWB3(>~ta27kuYgunLI}xn z;E^TgT5txS`ES(GqGX0Tcydx^m7qlb11)QS(lTpIj!}&TMOV&xklu>WG6@=gM^$hU zsqAqsX92ZSPBEDz6^u7I!24R^6NM1^&ftu3=q%VVNWX$DML57*YeMm;FZnG)qGCfAP0B-MuJ>h4_@N{p?uhrM{Xtq9NnVy zCFY7~K@%n=0FFpYJvvnVc&sbJygfiI-2nLrYa-0sb_1kvPMgPyMIurmgGE8{n+?7M!XKvLvJ#5$=IF5twb6w12MI?2k(6A*0(bCZE2=0$9PhQ;rEeI zV>QfcA63A7fRo9Vq=4j4bGhgw%WI|^M*(2w^Y>&`0XjFa4{=jqKa@KTt z9)$}6ikr#+TyPVw2#`}i0D%bw@HU-LLJTJj`6~j-S>$L0aED~uQLPKk%?x+3kzh-aAiU3iz^O$xcg8ZS0R6M zZ{edh43~u?ZTkj+Wr;2G=a36mldc1*U_~9?4LL-|lS@b(AZ1E0fjgXd)d?KQYj{Bu zgPXMAlBXxQQ%GeH84`WwB}!gkkWeyviY@x0>|@Bs??6MuqR$%Z){J#IrYdKt&RSa2 zme!1A=e#DTtGH=eFg>vSxb8=F*_z%T+U{HKcm2_oKWSXE!>M%dy6*U9b$v>4PkUFp zqWQ?2uI`vOZ0MMqh6Tgof#p}0Ub)R?-JNN7=l$9Tmoo0->$(%UI=DjnQ0M%wCwj_$ zoF-#`Q1yC~p}ZmS4-&t^Z)uR^8@=roLg5@+T0MZ{vgrVPN93R+)4;5d4fll1TX2-7KMwM%|uKm6> zU3VZ;b#RqAxM8s^4t(DMJHuj!sL11mH=t)0W|H06y3TZ6=bE{5v$E#%YDdzRb+)CQ zZTD4wt^c7u?R@3I%bDue=X-PJ>ZIoVci_HHa%b}8#qgq%;3Smi$==lPAN0Xy+=QK^ ze_y}&1{@fDpx?Hy@Yw0z(Yr?<>N=kn_Q)l9$>=+!~9%dxSln8(q_+!dez*vs%sO6UW{td z5+Xyt4Do+w=saFc#@Z!8k`X+h;er$>hqpkp!EP%JlAOT$BuK7|_> zikNIfm%AwIizg%k(g-hWy6TnE}^K zJ_~RmHQxN#jv|iO`~27o4xV%X=u`V;(=siAYrZ?nIMMgnA?OBrdiwmw&i50!4tKNh zGy<>h`^67}&JKv4TSX`;*v?1z=_$P07i7=EH%#QSD^XFP(J3M&Ey|zaaG2YVSwF_E z#6AXk2H{WyjTu45fx{Lqh;!V}km&D79uAK5sfmd97YxL_AmiW>E1=sKf_M^#4aW;7 zagxv*Md{WD5rI(RF~|F_rCPF0`_oPP*PGx_#PKUe7jkrW-of&HEq|ZuVy_ zO=(M0*5XZDycx@$dCen*PVd~Pwl7~?x|keE4gYD?pSeD9WvUONs<4X3%&X=-8?O30 zhi)B8^=4dq#3STI9ejM0>P})POcY4{%S63PLI^!#9c3Wek z>&%YNb%vX|1>IszvgYHed#<~#bzR%0+4}3Jjg-Z4yDIDKOglSQ&HK>l?EHn*f&OOa zGali`Pn)}%daJ0PRXKaxl|O5vA>IZKRX{_O#6@@@N+K^3ASs6enB$%3hkhGcCZ;de zEC~fKD15|FjlRJdibGKfY7iHnzzxZST!jp{2MXUtZMPu}1XGYrP~;LRWX>bIpi&i; zA$%^Cytr=O0iTrNCjyO&D!lk%STZCJJgoFQ24k=hJ|(N%`Mi3UU;p=^u@~t`q7Tcw z>Nc5;EtLeW@hh}sSxj8`I*=xl2M~gc+p7@`9|G{^p({~Z7{ys3dyeenQglJS2`qwZ zeFGW)k(-1~}-l8-6`egE*a zlV@LtPbkPI7v#1*xqC+Lc9Dx!ez=Xy;=JqNi>L?Mf=p0sNGL$E}wQv}UW;K%2K}8F+GEplRoS#uO)& MblVn%F=6fh1AA3->Hq)$ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/body.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/body.py new file mode 100644 index 00000000..d7ee29e7 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/body.py @@ -0,0 +1,268 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import io +import sys + +from gunicorn.http.errors import (NoMoreData, ChunkMissingTerminator, + InvalidChunkSize) + + +class ChunkedReader: + def __init__(self, req, unreader): + self.req = req + self.parser = self.parse_chunked(unreader) + self.buf = io.BytesIO() + + def read(self, size): + if not isinstance(size, int): + raise TypeError("size must be an integer type") + if size < 0: + raise ValueError("Size must be positive.") + if size == 0: + return b"" + + if self.parser: + while self.buf.tell() < size: + try: + self.buf.write(next(self.parser)) + except StopIteration: + self.parser = None + break + + data = self.buf.getvalue() + ret, rest = data[:size], data[size:] + self.buf = io.BytesIO() + self.buf.write(rest) + return ret + + def parse_trailers(self, unreader, data): + buf = io.BytesIO() + buf.write(data) + + idx = buf.getvalue().find(b"\r\n\r\n") + done = buf.getvalue()[:2] == b"\r\n" + while idx < 0 and not done: + self.get_data(unreader, buf) + idx = buf.getvalue().find(b"\r\n\r\n") + done = buf.getvalue()[:2] == b"\r\n" + if done: + unreader.unread(buf.getvalue()[2:]) + return b"" + self.req.trailers = self.req.parse_headers(buf.getvalue()[:idx], from_trailer=True) + unreader.unread(buf.getvalue()[idx + 4:]) + + def parse_chunked(self, unreader): + (size, rest) = self.parse_chunk_size(unreader) + while size > 0: + while size > len(rest): + size -= len(rest) + yield rest + rest = unreader.read() + if not rest: + raise NoMoreData() + yield rest[:size] + # Remove \r\n after chunk + rest = rest[size:] + while len(rest) < 2: + new_data = unreader.read() + if not new_data: + break + rest += new_data + if rest[:2] != b'\r\n': + raise ChunkMissingTerminator(rest[:2]) + (size, rest) = self.parse_chunk_size(unreader, data=rest[2:]) + + def parse_chunk_size(self, unreader, data=None): + buf = io.BytesIO() + if data is not None: + buf.write(data) + + idx = buf.getvalue().find(b"\r\n") + while idx < 0: + self.get_data(unreader, buf) + idx = buf.getvalue().find(b"\r\n") + + data = buf.getvalue() + line, rest_chunk = data[:idx], data[idx + 2:] + + # RFC9112 7.1.1: BWS before chunk-ext - but ONLY then + chunk_size, *chunk_ext = line.split(b";", 1) + if chunk_ext: + chunk_size = chunk_size.rstrip(b" \t") + if any(n not in b"0123456789abcdefABCDEF" for n in chunk_size): + raise InvalidChunkSize(chunk_size) + if len(chunk_size) == 0: + raise InvalidChunkSize(chunk_size) + chunk_size = int(chunk_size, 16) + + if chunk_size == 0: + try: + self.parse_trailers(unreader, rest_chunk) + except NoMoreData: + pass + return (0, None) + return (chunk_size, rest_chunk) + + def get_data(self, unreader, buf): + data = unreader.read() + if not data: + raise NoMoreData() + buf.write(data) + + +class LengthReader: + def __init__(self, unreader, length): + self.unreader = unreader + self.length = length + + def read(self, size): + if not isinstance(size, int): + raise TypeError("size must be an integral type") + + size = min(self.length, size) + if size < 0: + raise ValueError("Size must be positive.") + if size == 0: + return b"" + + buf = io.BytesIO() + data = self.unreader.read() + while data: + buf.write(data) + if buf.tell() >= size: + break + data = self.unreader.read() + + buf = buf.getvalue() + ret, rest = buf[:size], buf[size:] + self.unreader.unread(rest) + self.length -= size + return ret + + +class EOFReader: + def __init__(self, unreader): + self.unreader = unreader + self.buf = io.BytesIO() + self.finished = False + + def read(self, size): + if not isinstance(size, int): + raise TypeError("size must be an integral type") + if size < 0: + raise ValueError("Size must be positive.") + if size == 0: + return b"" + + if self.finished: + data = self.buf.getvalue() + ret, rest = data[:size], data[size:] + self.buf = io.BytesIO() + self.buf.write(rest) + return ret + + data = self.unreader.read() + while data: + self.buf.write(data) + if self.buf.tell() > size: + break + data = self.unreader.read() + + if not data: + self.finished = True + + data = self.buf.getvalue() + ret, rest = data[:size], data[size:] + self.buf = io.BytesIO() + self.buf.write(rest) + return ret + + +class Body: + def __init__(self, reader): + self.reader = reader + self.buf = io.BytesIO() + + def __iter__(self): + return self + + def __next__(self): + ret = self.readline() + if not ret: + raise StopIteration() + return ret + + next = __next__ + + def getsize(self, size): + if size is None: + return sys.maxsize + elif not isinstance(size, int): + raise TypeError("size must be an integral type") + elif size < 0: + return sys.maxsize + return size + + def read(self, size=None): + size = self.getsize(size) + if size == 0: + return b"" + + if size < self.buf.tell(): + data = self.buf.getvalue() + ret, rest = data[:size], data[size:] + self.buf = io.BytesIO() + self.buf.write(rest) + return ret + + while size > self.buf.tell(): + data = self.reader.read(1024) + if not data: + break + self.buf.write(data) + + data = self.buf.getvalue() + ret, rest = data[:size], data[size:] + self.buf = io.BytesIO() + self.buf.write(rest) + return ret + + def readline(self, size=None): + size = self.getsize(size) + if size == 0: + return b"" + + data = self.buf.getvalue() + self.buf = io.BytesIO() + + ret = [] + while 1: + idx = data.find(b"\n", 0, size) + idx = idx + 1 if idx >= 0 else size if len(data) >= size else 0 + if idx: + ret.append(data[:idx]) + self.buf.write(data[idx:]) + break + + ret.append(data) + size -= len(data) + data = self.reader.read(min(1024, size)) + if not data: + break + + return b"".join(ret) + + def readlines(self, size=None): + ret = [] + data = self.read() + while data: + pos = data.find(b"\n") + if pos < 0: + ret.append(data) + data = b"" + else: + line, data = data[:pos + 1], data[pos + 1:] + ret.append(line) + return ret diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/errors.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/errors.py new file mode 100644 index 00000000..bcb97007 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/errors.py @@ -0,0 +1,145 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# We don't need to call super() in __init__ methods of our +# BaseException and Exception classes because we also define +# our own __str__ methods so there is no need to pass 'message' +# to the base class to get a meaningful output from 'str(exc)'. +# pylint: disable=super-init-not-called + + +class ParseException(Exception): + pass + + +class NoMoreData(IOError): + def __init__(self, buf=None): + self.buf = buf + + def __str__(self): + return "No more data after: %r" % self.buf + + +class ConfigurationProblem(ParseException): + def __init__(self, info): + self.info = info + self.code = 500 + + def __str__(self): + return "Configuration problem: %s" % self.info + + +class InvalidRequestLine(ParseException): + def __init__(self, req): + self.req = req + self.code = 400 + + def __str__(self): + return "Invalid HTTP request line: %r" % self.req + + +class InvalidRequestMethod(ParseException): + def __init__(self, method): + self.method = method + + def __str__(self): + return "Invalid HTTP method: %r" % self.method + + +class InvalidHTTPVersion(ParseException): + def __init__(self, version): + self.version = version + + def __str__(self): + return "Invalid HTTP Version: %r" % (self.version,) + + +class InvalidHeader(ParseException): + def __init__(self, hdr, req=None): + self.hdr = hdr + self.req = req + + def __str__(self): + return "Invalid HTTP Header: %r" % self.hdr + + +class ObsoleteFolding(ParseException): + def __init__(self, hdr): + self.hdr = hdr + + def __str__(self): + return "Obsolete line folding is unacceptable: %r" % (self.hdr, ) + + +class InvalidHeaderName(ParseException): + def __init__(self, hdr): + self.hdr = hdr + + def __str__(self): + return "Invalid HTTP header name: %r" % self.hdr + + +class UnsupportedTransferCoding(ParseException): + def __init__(self, hdr): + self.hdr = hdr + self.code = 501 + + def __str__(self): + return "Unsupported transfer coding: %r" % self.hdr + + +class InvalidChunkSize(IOError): + def __init__(self, data): + self.data = data + + def __str__(self): + return "Invalid chunk size: %r" % self.data + + +class ChunkMissingTerminator(IOError): + def __init__(self, term): + self.term = term + + def __str__(self): + return "Invalid chunk terminator is not '\\r\\n': %r" % self.term + + +class LimitRequestLine(ParseException): + def __init__(self, size, max_size): + self.size = size + self.max_size = max_size + + def __str__(self): + return "Request Line is too large (%s > %s)" % (self.size, self.max_size) + + +class LimitRequestHeaders(ParseException): + def __init__(self, msg): + self.msg = msg + + def __str__(self): + return self.msg + + +class InvalidProxyLine(ParseException): + def __init__(self, line): + self.line = line + self.code = 400 + + def __str__(self): + return "Invalid PROXY line: %r" % self.line + + +class ForbiddenProxyRequest(ParseException): + def __init__(self, host): + self.host = host + self.code = 403 + + def __str__(self): + return "Proxy request from %r not allowed" % self.host + + +class InvalidSchemeHeaders(ParseException): + def __str__(self): + return "Contradictory scheme headers" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/message.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/message.py new file mode 100644 index 00000000..59ce0bf4 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/message.py @@ -0,0 +1,463 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import io +import re +import socket + +from gunicorn.http.body import ChunkedReader, LengthReader, EOFReader, Body +from gunicorn.http.errors import ( + InvalidHeader, InvalidHeaderName, NoMoreData, + InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, + LimitRequestLine, LimitRequestHeaders, + UnsupportedTransferCoding, ObsoleteFolding, +) +from gunicorn.http.errors import InvalidProxyLine, ForbiddenProxyRequest +from gunicorn.http.errors import InvalidSchemeHeaders +from gunicorn.util import bytes_to_str, split_request_uri + +MAX_REQUEST_LINE = 8190 +MAX_HEADERS = 32768 +DEFAULT_MAX_HEADERFIELD_SIZE = 8190 + +# verbosely on purpose, avoid backslash ambiguity +RFC9110_5_6_2_TOKEN_SPECIALS = r"!#$%&'*+-.^_`|~" +TOKEN_RE = re.compile(r"[%s0-9a-zA-Z]+" % (re.escape(RFC9110_5_6_2_TOKEN_SPECIALS))) +METHOD_BADCHAR_RE = re.compile("[a-z#]") +# usually 1.0 or 1.1 - RFC9112 permits restricting to single-digit versions +VERSION_RE = re.compile(r"HTTP/(\d)\.(\d)") +RFC9110_5_5_INVALID_AND_DANGEROUS = re.compile(r"[\0\r\n]") + + +class Message: + def __init__(self, cfg, unreader, peer_addr): + self.cfg = cfg + self.unreader = unreader + self.peer_addr = peer_addr + self.remote_addr = peer_addr + self.version = None + self.headers = [] + self.trailers = [] + self.body = None + self.scheme = "https" if cfg.is_ssl else "http" + self.must_close = False + + # set headers limits + self.limit_request_fields = cfg.limit_request_fields + if (self.limit_request_fields <= 0 + or self.limit_request_fields > MAX_HEADERS): + self.limit_request_fields = MAX_HEADERS + self.limit_request_field_size = cfg.limit_request_field_size + if self.limit_request_field_size < 0: + self.limit_request_field_size = DEFAULT_MAX_HEADERFIELD_SIZE + + # set max header buffer size + max_header_field_size = self.limit_request_field_size or DEFAULT_MAX_HEADERFIELD_SIZE + self.max_buffer_headers = self.limit_request_fields * \ + (max_header_field_size + 2) + 4 + + unused = self.parse(self.unreader) + self.unreader.unread(unused) + self.set_body_reader() + + def force_close(self): + self.must_close = True + + def parse(self, unreader): + raise NotImplementedError() + + def parse_headers(self, data, from_trailer=False): + cfg = self.cfg + headers = [] + + # Split lines on \r\n + lines = [bytes_to_str(line) for line in data.split(b"\r\n")] + + # handle scheme headers + scheme_header = False + secure_scheme_headers = {} + forwarder_headers = [] + if from_trailer: + # nonsense. either a request is https from the beginning + # .. or we are just behind a proxy who does not remove conflicting trailers + pass + elif ('*' in cfg.forwarded_allow_ips or + not isinstance(self.peer_addr, tuple) + or self.peer_addr[0] in cfg.forwarded_allow_ips): + secure_scheme_headers = cfg.secure_scheme_headers + forwarder_headers = cfg.forwarder_headers + + # Parse headers into key/value pairs paying attention + # to continuation lines. + while lines: + if len(headers) >= self.limit_request_fields: + raise LimitRequestHeaders("limit request headers fields") + + # Parse initial header name: value pair. + curr = lines.pop(0) + header_length = len(curr) + len("\r\n") + if curr.find(":") <= 0: + raise InvalidHeader(curr) + name, value = curr.split(":", 1) + if self.cfg.strip_header_spaces: + name = name.rstrip(" \t") + if not TOKEN_RE.fullmatch(name): + raise InvalidHeaderName(name) + + # this is still a dangerous place to do this + # but it is more correct than doing it before the pattern match: + # after we entered Unicode wonderland, 8bits could case-shift into ASCII: + # b"\xDF".decode("latin-1").upper().encode("ascii") == b"SS" + name = name.upper() + + value = [value.strip(" \t")] + + # Consume value continuation lines.. + while lines and lines[0].startswith((" ", "\t")): + # .. which is obsolete here, and no longer done by default + if not self.cfg.permit_obsolete_folding: + raise ObsoleteFolding(name) + curr = lines.pop(0) + header_length += len(curr) + len("\r\n") + if header_length > self.limit_request_field_size > 0: + raise LimitRequestHeaders("limit request headers " + "fields size") + value.append(curr.strip("\t ")) + value = " ".join(value) + + if RFC9110_5_5_INVALID_AND_DANGEROUS.search(value): + raise InvalidHeader(name) + + if header_length > self.limit_request_field_size > 0: + raise LimitRequestHeaders("limit request headers fields size") + + if name in secure_scheme_headers: + secure = value == secure_scheme_headers[name] + scheme = "https" if secure else "http" + if scheme_header: + if scheme != self.scheme: + raise InvalidSchemeHeaders() + else: + scheme_header = True + self.scheme = scheme + + # ambiguous mapping allows fooling downstream, e.g. merging non-identical headers: + # X-Forwarded-For: 2001:db8::ha:cc:ed + # X_Forwarded_For: 127.0.0.1,::1 + # HTTP_X_FORWARDED_FOR = 2001:db8::ha:cc:ed,127.0.0.1,::1 + # Only modify after fixing *ALL* header transformations; network to wsgi env + if "_" in name: + if name in forwarder_headers or "*" in forwarder_headers: + # This forwarder may override our environment + pass + elif self.cfg.header_map == "dangerous": + # as if we did not know we cannot safely map this + pass + elif self.cfg.header_map == "drop": + # almost as if it never had been there + # but still counts against resource limits + continue + else: + # fail-safe fallthrough: refuse + raise InvalidHeaderName(name) + + headers.append((name, value)) + + return headers + + def set_body_reader(self): + chunked = False + content_length = None + + for (name, value) in self.headers: + if name == "CONTENT-LENGTH": + if content_length is not None: + raise InvalidHeader("CONTENT-LENGTH", req=self) + content_length = value + elif name == "TRANSFER-ENCODING": + # T-E can be a list + # https://datatracker.ietf.org/doc/html/rfc9112#name-transfer-encoding + vals = [v.strip() for v in value.split(',')] + for val in vals: + if val.lower() == "chunked": + # DANGER: transfer codings stack, and stacked chunking is never intended + if chunked: + raise InvalidHeader("TRANSFER-ENCODING", req=self) + chunked = True + elif val.lower() == "identity": + # does not do much, could still plausibly desync from what the proxy does + # safe option: nuke it, its never needed + if chunked: + raise InvalidHeader("TRANSFER-ENCODING", req=self) + elif val.lower() in ('compress', 'deflate', 'gzip'): + # chunked should be the last one + if chunked: + raise InvalidHeader("TRANSFER-ENCODING", req=self) + self.force_close() + else: + raise UnsupportedTransferCoding(value) + + if chunked: + # two potentially dangerous cases: + # a) CL + TE (TE overrides CL.. only safe if the recipient sees it that way too) + # b) chunked HTTP/1.0 (always faulty) + if self.version < (1, 1): + # framing wonky, see RFC 9112 Section 6.1 + raise InvalidHeader("TRANSFER-ENCODING", req=self) + if content_length is not None: + # we cannot be certain the message framing we understood matches proxy intent + # -> whatever happens next, remaining input must not be trusted + raise InvalidHeader("CONTENT-LENGTH", req=self) + self.body = Body(ChunkedReader(self, self.unreader)) + elif content_length is not None: + try: + if str(content_length).isnumeric(): + content_length = int(content_length) + else: + raise InvalidHeader("CONTENT-LENGTH", req=self) + except ValueError: + raise InvalidHeader("CONTENT-LENGTH", req=self) + + if content_length < 0: + raise InvalidHeader("CONTENT-LENGTH", req=self) + + self.body = Body(LengthReader(self.unreader, content_length)) + else: + self.body = Body(EOFReader(self.unreader)) + + def should_close(self): + if self.must_close: + return True + for (h, v) in self.headers: + if h == "CONNECTION": + v = v.lower().strip(" \t") + if v == "close": + return True + elif v == "keep-alive": + return False + break + return self.version <= (1, 0) + + +class Request(Message): + def __init__(self, cfg, unreader, peer_addr, req_number=1): + self.method = None + self.uri = None + self.path = None + self.query = None + self.fragment = None + + # get max request line size + self.limit_request_line = cfg.limit_request_line + if (self.limit_request_line < 0 + or self.limit_request_line >= MAX_REQUEST_LINE): + self.limit_request_line = MAX_REQUEST_LINE + + self.req_number = req_number + self.proxy_protocol_info = None + super().__init__(cfg, unreader, peer_addr) + + def get_data(self, unreader, buf, stop=False): + data = unreader.read() + if not data: + if stop: + raise StopIteration() + raise NoMoreData(buf.getvalue()) + buf.write(data) + + def parse(self, unreader): + buf = io.BytesIO() + self.get_data(unreader, buf, stop=True) + + # get request line + line, rbuf = self.read_line(unreader, buf, self.limit_request_line) + + # proxy protocol + if self.proxy_protocol(bytes_to_str(line)): + # get next request line + buf = io.BytesIO() + buf.write(rbuf) + line, rbuf = self.read_line(unreader, buf, self.limit_request_line) + + self.parse_request_line(line) + buf = io.BytesIO() + buf.write(rbuf) + + # Headers + data = buf.getvalue() + idx = data.find(b"\r\n\r\n") + + done = data[:2] == b"\r\n" + while True: + idx = data.find(b"\r\n\r\n") + done = data[:2] == b"\r\n" + + if idx < 0 and not done: + self.get_data(unreader, buf) + data = buf.getvalue() + if len(data) > self.max_buffer_headers: + raise LimitRequestHeaders("max buffer headers") + else: + break + + if done: + self.unreader.unread(data[2:]) + return b"" + + self.headers = self.parse_headers(data[:idx], from_trailer=False) + + ret = data[idx + 4:] + buf = None + return ret + + def read_line(self, unreader, buf, limit=0): + data = buf.getvalue() + + while True: + idx = data.find(b"\r\n") + if idx >= 0: + # check if the request line is too large + if idx > limit > 0: + raise LimitRequestLine(idx, limit) + break + if len(data) - 2 > limit > 0: + raise LimitRequestLine(len(data), limit) + self.get_data(unreader, buf) + data = buf.getvalue() + + return (data[:idx], # request line, + data[idx + 2:]) # residue in the buffer, skip \r\n + + def proxy_protocol(self, line): + """\ + Detect, check and parse proxy protocol. + + :raises: ForbiddenProxyRequest, InvalidProxyLine. + :return: True for proxy protocol line else False + """ + if not self.cfg.proxy_protocol: + return False + + if self.req_number != 1: + return False + + if not line.startswith("PROXY"): + return False + + self.proxy_protocol_access_check() + self.parse_proxy_protocol(line) + + return True + + def proxy_protocol_access_check(self): + # check in allow list + if ("*" not in self.cfg.proxy_allow_ips and + isinstance(self.peer_addr, tuple) and + self.peer_addr[0] not in self.cfg.proxy_allow_ips): + raise ForbiddenProxyRequest(self.peer_addr[0]) + + def parse_proxy_protocol(self, line): + bits = line.split(" ") + + if len(bits) != 6: + raise InvalidProxyLine(line) + + # Extract data + proto = bits[1] + s_addr = bits[2] + d_addr = bits[3] + + # Validation + if proto not in ["TCP4", "TCP6"]: + raise InvalidProxyLine("protocol '%s' not supported" % proto) + if proto == "TCP4": + try: + socket.inet_pton(socket.AF_INET, s_addr) + socket.inet_pton(socket.AF_INET, d_addr) + except OSError: + raise InvalidProxyLine(line) + elif proto == "TCP6": + try: + socket.inet_pton(socket.AF_INET6, s_addr) + socket.inet_pton(socket.AF_INET6, d_addr) + except OSError: + raise InvalidProxyLine(line) + + try: + s_port = int(bits[4]) + d_port = int(bits[5]) + except ValueError: + raise InvalidProxyLine("invalid port %s" % line) + + if not ((0 <= s_port <= 65535) and (0 <= d_port <= 65535)): + raise InvalidProxyLine("invalid port %s" % line) + + # Set data + self.proxy_protocol_info = { + "proxy_protocol": proto, + "client_addr": s_addr, + "client_port": s_port, + "proxy_addr": d_addr, + "proxy_port": d_port + } + + def parse_request_line(self, line_bytes): + bits = [bytes_to_str(bit) for bit in line_bytes.split(b" ", 2)] + if len(bits) != 3: + raise InvalidRequestLine(bytes_to_str(line_bytes)) + + # Method: RFC9110 Section 9 + self.method = bits[0] + + # nonstandard restriction, suitable for all IANA registered methods + # partially enforced in previous gunicorn versions + if not self.cfg.permit_unconventional_http_method: + if METHOD_BADCHAR_RE.search(self.method): + raise InvalidRequestMethod(self.method) + if not 3 <= len(bits[0]) <= 20: + raise InvalidRequestMethod(self.method) + # standard restriction: RFC9110 token + if not TOKEN_RE.fullmatch(self.method): + raise InvalidRequestMethod(self.method) + # nonstandard and dangerous + # methods are merely uppercase by convention, no case-insensitive treatment is intended + if self.cfg.casefold_http_method: + self.method = self.method.upper() + + # URI + self.uri = bits[1] + + # Python stdlib explicitly tells us it will not perform validation. + # https://docs.python.org/3/library/urllib.parse.html#url-parsing-security + # There are *four* `request-target` forms in rfc9112, none of them can be empty: + # 1. origin-form, which starts with a slash + # 2. absolute-form, which starts with a non-empty scheme + # 3. authority-form, (for CONNECT) which contains a colon after the host + # 4. asterisk-form, which is an asterisk (`\x2A`) + # => manually reject one always invalid URI: empty + if len(self.uri) == 0: + raise InvalidRequestLine(bytes_to_str(line_bytes)) + + try: + parts = split_request_uri(self.uri) + except ValueError: + raise InvalidRequestLine(bytes_to_str(line_bytes)) + self.path = parts.path or "" + self.query = parts.query or "" + self.fragment = parts.fragment or "" + + # Version + match = VERSION_RE.fullmatch(bits[2]) + if match is None: + raise InvalidHTTPVersion(bits[2]) + self.version = (int(match.group(1)), int(match.group(2))) + if not (1, 0) <= self.version < (2, 0): + # if ever relaxing this, carefully review Content-Encoding processing + if not self.cfg.permit_unconventional_http_version: + raise InvalidHTTPVersion(self.version) + + def set_body_reader(self): + super().set_body_reader() + if isinstance(self.body.reader, EOFReader): + self.body = Body(LengthReader(self.unreader, 0)) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/parser.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/parser.py new file mode 100644 index 00000000..88da17ab --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/parser.py @@ -0,0 +1,51 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +from gunicorn.http.message import Request +from gunicorn.http.unreader import SocketUnreader, IterUnreader + + +class Parser: + + mesg_class = None + + def __init__(self, cfg, source, source_addr): + self.cfg = cfg + if hasattr(source, "recv"): + self.unreader = SocketUnreader(source) + else: + self.unreader = IterUnreader(source) + self.mesg = None + self.source_addr = source_addr + + # request counter (for keepalive connetions) + self.req_count = 0 + + def __iter__(self): + return self + + def __next__(self): + # Stop if HTTP dictates a stop. + if self.mesg and self.mesg.should_close(): + raise StopIteration() + + # Discard any unread body of the previous message + if self.mesg: + data = self.mesg.body.read(8192) + while data: + data = self.mesg.body.read(8192) + + # Parse the next request + self.req_count += 1 + self.mesg = self.mesg_class(self.cfg, self.unreader, self.source_addr, self.req_count) + if not self.mesg: + raise StopIteration() + return self.mesg + + next = __next__ + + +class RequestParser(Parser): + + mesg_class = Request diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/unreader.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/unreader.py new file mode 100644 index 00000000..9aadfbcf --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/unreader.py @@ -0,0 +1,78 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import io +import os + +# Classes that can undo reading data from +# a given type of data source. + + +class Unreader: + def __init__(self): + self.buf = io.BytesIO() + + def chunk(self): + raise NotImplementedError() + + def read(self, size=None): + if size is not None and not isinstance(size, int): + raise TypeError("size parameter must be an int or long.") + + if size is not None: + if size == 0: + return b"" + if size < 0: + size = None + + self.buf.seek(0, os.SEEK_END) + + if size is None and self.buf.tell(): + ret = self.buf.getvalue() + self.buf = io.BytesIO() + return ret + if size is None: + d = self.chunk() + return d + + while self.buf.tell() < size: + chunk = self.chunk() + if not chunk: + ret = self.buf.getvalue() + self.buf = io.BytesIO() + return ret + self.buf.write(chunk) + data = self.buf.getvalue() + self.buf = io.BytesIO() + self.buf.write(data[size:]) + return data[:size] + + def unread(self, data): + self.buf.seek(0, os.SEEK_END) + self.buf.write(data) + + +class SocketUnreader(Unreader): + def __init__(self, sock, max_chunk=8192): + super().__init__() + self.sock = sock + self.mxchunk = max_chunk + + def chunk(self): + return self.sock.recv(self.mxchunk) + + +class IterUnreader(Unreader): + def __init__(self, iterable): + super().__init__() + self.iter = iter(iterable) + + def chunk(self): + if not self.iter: + return b"" + try: + return next(self.iter) + except StopIteration: + self.iter = None + return b"" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/wsgi.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/wsgi.py new file mode 100644 index 00000000..419ac503 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/http/wsgi.py @@ -0,0 +1,401 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import io +import logging +import os +import re +import sys + +from gunicorn.http.message import TOKEN_RE +from gunicorn.http.errors import ConfigurationProblem, InvalidHeader, InvalidHeaderName +from gunicorn import SERVER_SOFTWARE, SERVER +from gunicorn import util + +# Send files in at most 1GB blocks as some operating systems can have problems +# with sending files in blocks over 2GB. +BLKSIZE = 0x3FFFFFFF + +# RFC9110 5.5: field-vchar = VCHAR / obs-text +# RFC4234 B.1: VCHAR = 0x21-x07E = printable ASCII +HEADER_VALUE_RE = re.compile(r'[ \t\x21-\x7e\x80-\xff]*') + +log = logging.getLogger(__name__) + + +class FileWrapper: + + def __init__(self, filelike, blksize=8192): + self.filelike = filelike + self.blksize = blksize + if hasattr(filelike, 'close'): + self.close = filelike.close + + def __getitem__(self, key): + data = self.filelike.read(self.blksize) + if data: + return data + raise IndexError + + +class WSGIErrorsWrapper(io.RawIOBase): + + def __init__(self, cfg): + # There is no public __init__ method for RawIOBase so + # we don't need to call super() in the __init__ method. + # pylint: disable=super-init-not-called + errorlog = logging.getLogger("gunicorn.error") + handlers = errorlog.handlers + self.streams = [] + + if cfg.errorlog == "-": + self.streams.append(sys.stderr) + handlers = handlers[1:] + + for h in handlers: + if hasattr(h, "stream"): + self.streams.append(h.stream) + + def write(self, data): + for stream in self.streams: + try: + stream.write(data) + except UnicodeError: + stream.write(data.encode("UTF-8")) + stream.flush() + + +def base_environ(cfg): + return { + "wsgi.errors": WSGIErrorsWrapper(cfg), + "wsgi.version": (1, 0), + "wsgi.multithread": False, + "wsgi.multiprocess": (cfg.workers > 1), + "wsgi.run_once": False, + "wsgi.file_wrapper": FileWrapper, + "wsgi.input_terminated": True, + "SERVER_SOFTWARE": SERVER_SOFTWARE, + } + + +def default_environ(req, sock, cfg): + env = base_environ(cfg) + env.update({ + "wsgi.input": req.body, + "gunicorn.socket": sock, + "REQUEST_METHOD": req.method, + "QUERY_STRING": req.query, + "RAW_URI": req.uri, + "SERVER_PROTOCOL": "HTTP/%s" % ".".join([str(v) for v in req.version]) + }) + return env + + +def proxy_environ(req): + info = req.proxy_protocol_info + + if not info: + return {} + + return { + "PROXY_PROTOCOL": info["proxy_protocol"], + "REMOTE_ADDR": info["client_addr"], + "REMOTE_PORT": str(info["client_port"]), + "PROXY_ADDR": info["proxy_addr"], + "PROXY_PORT": str(info["proxy_port"]), + } + + +def create(req, sock, client, server, cfg): + resp = Response(req, sock, cfg) + + # set initial environ + environ = default_environ(req, sock, cfg) + + # default variables + host = None + script_name = os.environ.get("SCRIPT_NAME", "") + + # add the headers to the environ + for hdr_name, hdr_value in req.headers: + if hdr_name == "EXPECT": + # handle expect + if hdr_value.lower() == "100-continue": + sock.send(b"HTTP/1.1 100 Continue\r\n\r\n") + elif hdr_name == 'HOST': + host = hdr_value + elif hdr_name == "SCRIPT_NAME": + script_name = hdr_value + elif hdr_name == "CONTENT-TYPE": + environ['CONTENT_TYPE'] = hdr_value + continue + elif hdr_name == "CONTENT-LENGTH": + environ['CONTENT_LENGTH'] = hdr_value + continue + + # do not change lightly, this is a common source of security problems + # RFC9110 Section 17.10 discourages ambiguous or incomplete mappings + key = 'HTTP_' + hdr_name.replace('-', '_') + if key in environ: + hdr_value = "%s,%s" % (environ[key], hdr_value) + environ[key] = hdr_value + + # set the url scheme + environ['wsgi.url_scheme'] = req.scheme + + # set the REMOTE_* keys in environ + # authors should be aware that REMOTE_HOST and REMOTE_ADDR + # may not qualify the remote addr: + # http://www.ietf.org/rfc/rfc3875 + if isinstance(client, str): + environ['REMOTE_ADDR'] = client + elif isinstance(client, bytes): + environ['REMOTE_ADDR'] = client.decode() + else: + environ['REMOTE_ADDR'] = client[0] + environ['REMOTE_PORT'] = str(client[1]) + + # handle the SERVER_* + # Normally only the application should use the Host header but since the + # WSGI spec doesn't support unix sockets, we are using it to create + # viable SERVER_* if possible. + if isinstance(server, str): + server = server.split(":") + if len(server) == 1: + # unix socket + if host: + server = host.split(':') + if len(server) == 1: + if req.scheme == "http": + server.append(80) + elif req.scheme == "https": + server.append(443) + else: + server.append('') + else: + # no host header given which means that we are not behind a + # proxy, so append an empty port. + server.append('') + environ['SERVER_NAME'] = server[0] + environ['SERVER_PORT'] = str(server[1]) + + # set the path and script name + path_info = req.path + if script_name: + if not path_info.startswith(script_name): + raise ConfigurationProblem( + "Request path %r does not start with SCRIPT_NAME %r" % + (path_info, script_name)) + path_info = path_info[len(script_name):] + environ['PATH_INFO'] = util.unquote_to_wsgi_str(path_info) + environ['SCRIPT_NAME'] = script_name + + # override the environ with the correct remote and server address if + # we are behind a proxy using the proxy protocol. + environ.update(proxy_environ(req)) + return resp, environ + + +class Response: + + def __init__(self, req, sock, cfg): + self.req = req + self.sock = sock + self.version = SERVER + self.status = None + self.chunked = False + self.must_close = False + self.headers = [] + self.headers_sent = False + self.response_length = None + self.sent = 0 + self.upgrade = False + self.cfg = cfg + + def force_close(self): + self.must_close = True + + def should_close(self): + if self.must_close or self.req.should_close(): + return True + if self.response_length is not None or self.chunked: + return False + if self.req.method == 'HEAD': + return False + if self.status_code < 200 or self.status_code in (204, 304): + return False + return True + + def start_response(self, status, headers, exc_info=None): + if exc_info: + try: + if self.status and self.headers_sent: + util.reraise(exc_info[0], exc_info[1], exc_info[2]) + finally: + exc_info = None + elif self.status is not None: + raise AssertionError("Response headers already set!") + + self.status = status + + # get the status code from the response here so we can use it to check + # the need for the connection header later without parsing the string + # each time. + try: + self.status_code = int(self.status.split()[0]) + except ValueError: + self.status_code = None + + self.process_headers(headers) + self.chunked = self.is_chunked() + return self.write + + def process_headers(self, headers): + for name, value in headers: + if not isinstance(name, str): + raise TypeError('%r is not a string' % name) + + if not TOKEN_RE.fullmatch(name): + raise InvalidHeaderName('%r' % name) + + if not isinstance(value, str): + raise TypeError('%r is not a string' % value) + + if not HEADER_VALUE_RE.fullmatch(value): + raise InvalidHeader('%r' % value) + + # RFC9110 5.5 + value = value.strip(" \t") + lname = name.lower() + if lname == "content-length": + self.response_length = int(value) + elif util.is_hoppish(name): + if lname == "connection": + # handle websocket + if value.lower() == "upgrade": + self.upgrade = True + elif lname == "upgrade": + if value.lower() == "websocket": + self.headers.append((name, value)) + + # ignore hopbyhop headers + continue + self.headers.append((name, value)) + + def is_chunked(self): + # Only use chunked responses when the client is + # speaking HTTP/1.1 or newer and there was + # no Content-Length header set. + if self.response_length is not None: + return False + elif self.req.version <= (1, 0): + return False + elif self.req.method == 'HEAD': + # Responses to a HEAD request MUST NOT contain a response body. + return False + elif self.status_code in (204, 304): + # Do not use chunked responses when the response is guaranteed to + # not have a response body. + return False + return True + + def default_headers(self): + # set the connection header + if self.upgrade: + connection = "upgrade" + elif self.should_close(): + connection = "close" + else: + connection = "keep-alive" + + headers = [ + "HTTP/%s.%s %s\r\n" % (self.req.version[0], + self.req.version[1], self.status), + "Server: %s\r\n" % self.version, + "Date: %s\r\n" % util.http_date(), + "Connection: %s\r\n" % connection + ] + if self.chunked: + headers.append("Transfer-Encoding: chunked\r\n") + return headers + + def send_headers(self): + if self.headers_sent: + return + tosend = self.default_headers() + tosend.extend(["%s: %s\r\n" % (k, v) for k, v in self.headers]) + + header_str = "%s\r\n" % "".join(tosend) + util.write(self.sock, util.to_bytestring(header_str, "latin-1")) + self.headers_sent = True + + def write(self, arg): + self.send_headers() + if not isinstance(arg, bytes): + raise TypeError('%r is not a byte' % arg) + arglen = len(arg) + tosend = arglen + if self.response_length is not None: + if self.sent >= self.response_length: + # Never write more than self.response_length bytes + return + + tosend = min(self.response_length - self.sent, tosend) + if tosend < arglen: + arg = arg[:tosend] + + # Sending an empty chunk signals the end of the + # response and prematurely closes the response + if self.chunked and tosend == 0: + return + + self.sent += tosend + util.write(self.sock, arg, self.chunked) + + def can_sendfile(self): + return self.cfg.sendfile is not False + + def sendfile(self, respiter): + if self.cfg.is_ssl or not self.can_sendfile(): + return False + + if not util.has_fileno(respiter.filelike): + return False + + fileno = respiter.filelike.fileno() + try: + offset = os.lseek(fileno, 0, os.SEEK_CUR) + if self.response_length is None: + filesize = os.fstat(fileno).st_size + nbytes = filesize - offset + else: + nbytes = self.response_length + except (OSError, io.UnsupportedOperation): + return False + + self.send_headers() + + if self.is_chunked(): + chunk_size = "%X\r\n" % nbytes + self.sock.sendall(chunk_size.encode('utf-8')) + if nbytes > 0: + self.sock.sendfile(respiter.filelike, offset=offset, count=nbytes) + + if self.is_chunked(): + self.sock.sendall(b"\r\n") + + os.lseek(fileno, offset, os.SEEK_SET) + + return True + + def write_file(self, respiter): + if not self.sendfile(respiter): + for item in respiter: + self.write(item) + + def close(self): + if not self.headers_sent: + self.send_headers() + if self.chunked: + util.write_chunk(self.sock, b"") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4d7ff16c0f952aaa78ca82dc5534e2d380ff2bf GIT binary patch literal 203 zcmX@j%ge<81h$WPGC=fW5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!%F+)lPAw|dPt8uu zE6&Ku%u7kk(f9NW@zwWrbTQN~EX}OSO)M@+Ez&Pb%`4N-$xPBOs4U6I&okCDG}155 zEJ@WZNKDR7OiwM=PcO~OOwKRL)6dK+E-5O_P0cIOkB`sH%PfhH*DI*}#bJ}1pHiBW YYFESxw3-o!i$RQ!%#4hTMa)1J0Q*ul_W%F@ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__pycache__/statsd.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/instrument/__pycache__/statsd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad2e38d34a1eb413c01a60f1ff742db980db59b1 GIT binary patch literal 7262 zcmc&(U2GFsmacNyPTBEaAU`%Fv>{=q(-4RJ0Nv2gge0T`jeC~_W^e;m;i@?0_$S;d zL&rE0JL-opYBh;8QWB|0L?a#?vAdIzW;HxA+b^x%mpD!oPfb>8se7fFH#+o4qkh_R zs$69!ZD!|Tv|L%|-a2*aR-JRtIrlr)|K)VrDQIWDc8q_vhoZj53%yxNgO|5pFi-JR zh~jD96sJS9+M7Zq=$SZ^Fo(=E-ZRH732Vp-V@s%pw}x20CS>E;ke#=MYI%FeVWNg8 zzV;J}cL>&}j5dGBIb~{hW=@~yh|qC6l@uhun3#+U2_Y$SvY1NxQ)7M!hSI=~B>yBy z$*D*xe$*d{iy+YEh)$4CX0;0<|erImGa$PpFWYXMkFGGf*pU z0SYPu1*L(4+CV{ZprATX2Pz(N@^!r96FTIA-U+>%cLCSKyMfkCdD{0V))CZ|&z#b9 z?zqiK0`C`-l1$QuO^*8IaZdJ6a*_o0;^60xt2*2L&?5S`qYAi;XzG{$NuwSzP_4x( zrAoXkm8GAS_%tQ!E}$-amX2BVXUo05j9Dsd*12-6K7wZ)`ncT7E`6-Oi`2;;ofiW~ z+});4Nl%4D{qFk|HEps{a-GhP8MEmeiprWQW@s$)^^yK9po#I#St{n$@0a`7{_n@3LY> zDU7IOQi#ZkZSdoWFp06NxcF4GG^xx*rFI5nh4`4lM8=|ui{p7BNK$x=ONj9)2|p9u z_xthAtCB#ZPGN#eO5-sx$#e0};o;HCotOItx;pQq#Y}>eAa*Kn+J~N4;-5@Z?OCS@?8z(@oiJIt)=K~o*DRT_yq&w@1?!) znZN7obM?EaFWjE~L(CTkX`nyI0O(~eZvgpQGC6nJ4sTGr;(x+8XlF`(sdE*Zn2ZoL(=VF|y1v3Bq^M%% zNK{g+6Zf!}(3in0{NxQ7kV8O>71Jj=0!*nL$c`0TWqXze*4Uoh1t3M%@yPYiwb~R| zp*Ps>mmo~NJ}d3nVI_f(6d?!Ui*yrNG*&CHNE?t{MtBQY8Ar)&RnblqDqFzu&@nr@ z(6h=OTdH4UkL4PH7#28^`=<@Ile`I!ygm!m@2~)@bW%)4ci5mtXTHh`N6`wdk`+qA zJv;3HD?TePjI6TVOTBAsckTob!wwy}I~#1*Yqmq<4m${X;@n{gTbcbTTLjP+9^E7K zSx%xgFgVn>*krwV*1J%@Ag!{!OQUOSZ|)ip!ycV0bsKEYU$I9JW}2r=mJe2HIUkLSh;>~T#i+%@%v08LHx+mLYQDI1kF$4U@H7s0+VaZg*a zmVf?5)>2KbyrktsKW%-5tg+}7vNf-eHGpJ=ESt5G>)9Ie<19^!h()L;FzQ)uF*KUK3ni#nJ!a)!^vh6^(_-O>w{@+x%7tjIC5QUzQ9iISKj7tt(0f)mZx#vK4)L(UD~@8S@oRG4Xk-i zuUsg2PQPH__Fukndl4#LqPHA-9t9r;7kXC@o_apI>9~lf@e=*LgeBHb`(6Ees4w;$ z>_5SLahwJksl<3SAcCpo<-e(^rQ{UTZp#EO z3!IdO&?ds2v>?fTK26lq6eGqd1N z_i;0>VqL@h{<-}#)-5P4$37RCp%S>q0ItKmwm>|nMExlv65$Y<85Xqjq-!o0F!rM#rF}V(7 zZBuhf92}DZU=BlI3%d$Lba$g1FpBIuz?Is77-m@Y9@+GE=e^x4y}v#E>(kH8&xJ2< z7Q7#Aus2@2CH9mo(SiO@VG8mQs)6RiXjGS6u|e=_2MLDO21l-<_0dglPu|+U>FL!jWSyBax|g+n9U(5v77>$9pr0B5cO8Ax+=e$}eM_)g3{>cOi~HIz`eQ8QFM zO0I^&sWJ)=Di%(Ph@ylx&bDUW7{n7EKV~urSU}>E1c#FqaGIO~K|r*)p=mpqRYB?2CtCV8?CuhIE65Ddi!jt>J-U#1_ET?0m@uCzCm^C%inngId`*Hmj8p|{+= zh1Sodb$4sA(KjEPi!C)38rx@?7l1SCH{FNU+=t-C!rIoE=;;b}!A>eG=Zyr+yr&wmL>^a>);5gm#4 z9q)UG`rSJR&$lrD(M$t{KXan+mC#O`DK$v64F!FJ zAi?5J8U^wR^{t7vu-j(0rE9y*Wa-&vO_pOwx{>s5+iA=3ZI-s2*tRxVF45b)PD>xX zeTcRU(=V;G<)%t+(c3V-2xEt3gw|e&uK_TG+N);=q#j0!i3r*uei>CoOXnq;Gn_&B zvq;`Uat=u!lJiJZ1;%moCK5bI{hobSGvrw^0hbu=5?Tb-g{Hr?Q}o%dDc2t;=YLas v{)cJ.", cfg.statsd_prefix) + + if isinstance(cfg.statsd_host, str): + address_family = socket.AF_UNIX + else: + address_family = socket.AF_INET + + try: + self.sock = socket.socket(address_family, socket.SOCK_DGRAM) + self.sock.connect(cfg.statsd_host) + except Exception: + self.sock = None + + self.dogstatsd_tags = cfg.dogstatsd_tags + + # Log errors and warnings + def critical(self, msg, *args, **kwargs): + Logger.critical(self, msg, *args, **kwargs) + self.increment("gunicorn.log.critical", 1) + + def error(self, msg, *args, **kwargs): + Logger.error(self, msg, *args, **kwargs) + self.increment("gunicorn.log.error", 1) + + def warning(self, msg, *args, **kwargs): + Logger.warning(self, msg, *args, **kwargs) + self.increment("gunicorn.log.warning", 1) + + def exception(self, msg, *args, **kwargs): + Logger.exception(self, msg, *args, **kwargs) + self.increment("gunicorn.log.exception", 1) + + # Special treatment for info, the most common log level + def info(self, msg, *args, **kwargs): + self.log(logging.INFO, msg, *args, **kwargs) + + # skip the run-of-the-mill logs + def debug(self, msg, *args, **kwargs): + self.log(logging.DEBUG, msg, *args, **kwargs) + + def log(self, lvl, msg, *args, **kwargs): + """Log a given statistic if metric, value and type are present + """ + try: + extra = kwargs.get("extra", None) + if extra is not None: + metric = extra.get(METRIC_VAR, None) + value = extra.get(VALUE_VAR, None) + typ = extra.get(MTYPE_VAR, None) + if metric and value and typ: + if typ == GAUGE_TYPE: + self.gauge(metric, value) + elif typ == COUNTER_TYPE: + self.increment(metric, value) + elif typ == HISTOGRAM_TYPE: + self.histogram(metric, value) + else: + pass + + # Log to parent logger only if there is something to say + if msg: + Logger.log(self, lvl, msg, *args, **kwargs) + except Exception: + Logger.warning(self, "Failed to log to statsd", exc_info=True) + + # access logging + def access(self, resp, req, environ, request_time): + """Measure request duration + request_time is a datetime.timedelta + """ + Logger.access(self, resp, req, environ, request_time) + duration_in_ms = request_time.seconds * 1000 + float(request_time.microseconds) / 10 ** 3 + status = resp.status + if isinstance(status, bytes): + status = status.decode('utf-8') + if isinstance(status, str): + status = int(status.split(None, 1)[0]) + self.histogram("gunicorn.request.duration", duration_in_ms) + self.increment("gunicorn.requests", 1) + self.increment("gunicorn.request.status.%d" % status, 1) + + # statsD methods + # you can use those directly if you want + def gauge(self, name, value): + self._sock_send("{0}{1}:{2}|g".format(self.prefix, name, value)) + + def increment(self, name, value, sampling_rate=1.0): + self._sock_send("{0}{1}:{2}|c|@{3}".format(self.prefix, name, value, sampling_rate)) + + def decrement(self, name, value, sampling_rate=1.0): + self._sock_send("{0}{1}:-{2}|c|@{3}".format(self.prefix, name, value, sampling_rate)) + + def histogram(self, name, value): + self._sock_send("{0}{1}:{2}|ms".format(self.prefix, name, value)) + + def _sock_send(self, msg): + try: + if isinstance(msg, str): + msg = msg.encode("ascii") + + # http://docs.datadoghq.com/guides/dogstatsd/#datagram-format + if self.dogstatsd_tags: + msg = msg + b"|#" + self.dogstatsd_tags.encode('ascii') + + if self.sock: + self.sock.send(msg) + except Exception: + Logger.warning(self, "Error sending message to statsd", exc_info=True) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/pidfile.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/pidfile.py new file mode 100644 index 00000000..b171f7d9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/pidfile.py @@ -0,0 +1,85 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import errno +import os +import tempfile + + +class Pidfile: + """\ + Manage a PID file. If a specific name is provided + it and '"%s.oldpid" % name' will be used. Otherwise + we create a temp file using os.mkstemp. + """ + + def __init__(self, fname): + self.fname = fname + self.pid = None + + def create(self, pid): + oldpid = self.validate() + if oldpid: + if oldpid == os.getpid(): + return + msg = "Already running on PID %s (or pid file '%s' is stale)" + raise RuntimeError(msg % (oldpid, self.fname)) + + self.pid = pid + + # Write pidfile + fdir = os.path.dirname(self.fname) + if fdir and not os.path.isdir(fdir): + raise RuntimeError("%s doesn't exist. Can't create pidfile." % fdir) + fd, fname = tempfile.mkstemp(dir=fdir) + os.write(fd, ("%s\n" % self.pid).encode('utf-8')) + if self.fname: + os.rename(fname, self.fname) + else: + self.fname = fname + os.close(fd) + + # set permissions to -rw-r--r-- + os.chmod(self.fname, 420) + + def rename(self, path): + self.unlink() + self.fname = path + self.create(self.pid) + + def unlink(self): + """ delete pidfile""" + try: + with open(self.fname) as f: + pid1 = int(f.read() or 0) + + if pid1 == self.pid: + os.unlink(self.fname) + except Exception: + pass + + def validate(self): + """ Validate pidfile and make it stale if needed""" + if not self.fname: + return + try: + with open(self.fname) as f: + try: + wpid = int(f.read()) + except ValueError: + return + + try: + os.kill(wpid, 0) + return wpid + except OSError as e: + if e.args[0] == errno.EPERM: + return wpid + if e.args[0] == errno.ESRCH: + return + raise + except OSError as e: + if e.args[0] == errno.ENOENT: + return + raise diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/reloader.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/reloader.py new file mode 100644 index 00000000..1c67f2a7 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/reloader.py @@ -0,0 +1,131 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. +# pylint: disable=no-else-continue + +import os +import os.path +import re +import sys +import time +import threading + +COMPILED_EXT_RE = re.compile(r'py[co]$') + + +class Reloader(threading.Thread): + def __init__(self, extra_files=None, interval=1, callback=None): + super().__init__() + self.daemon = True + self._extra_files = set(extra_files or ()) + self._interval = interval + self._callback = callback + + def add_extra_file(self, filename): + self._extra_files.add(filename) + + def get_files(self): + fnames = [ + COMPILED_EXT_RE.sub('py', module.__file__) + for module in tuple(sys.modules.values()) + if getattr(module, '__file__', None) + ] + + fnames.extend(self._extra_files) + + return fnames + + def run(self): + mtimes = {} + while True: + for filename in self.get_files(): + try: + mtime = os.stat(filename).st_mtime + except OSError: + continue + old_time = mtimes.get(filename) + if old_time is None: + mtimes[filename] = mtime + continue + elif mtime > old_time: + if self._callback: + self._callback(filename) + time.sleep(self._interval) + + +has_inotify = False +if sys.platform.startswith('linux'): + try: + from inotify.adapters import Inotify + import inotify.constants + has_inotify = True + except ImportError: + pass + + +if has_inotify: + + class InotifyReloader(threading.Thread): + event_mask = (inotify.constants.IN_CREATE | inotify.constants.IN_DELETE + | inotify.constants.IN_DELETE_SELF | inotify.constants.IN_MODIFY + | inotify.constants.IN_MOVE_SELF | inotify.constants.IN_MOVED_FROM + | inotify.constants.IN_MOVED_TO) + + def __init__(self, extra_files=None, callback=None): + super().__init__() + self.daemon = True + self._callback = callback + self._dirs = set() + self._watcher = Inotify() + + for extra_file in extra_files: + self.add_extra_file(extra_file) + + def add_extra_file(self, filename): + dirname = os.path.dirname(filename) + + if dirname in self._dirs: + return + + self._watcher.add_watch(dirname, mask=self.event_mask) + self._dirs.add(dirname) + + def get_dirs(self): + fnames = [ + os.path.dirname(os.path.abspath(COMPILED_EXT_RE.sub('py', module.__file__))) + for module in tuple(sys.modules.values()) + if getattr(module, '__file__', None) + ] + + return set(fnames) + + def run(self): + self._dirs = self.get_dirs() + + for dirname in self._dirs: + if os.path.isdir(dirname): + self._watcher.add_watch(dirname, mask=self.event_mask) + + for event in self._watcher.event_gen(): + if event is None: + continue + + filename = event[3] + + self._callback(filename) + +else: + + class InotifyReloader: + def __init__(self, extra_files=None, callback=None): + raise ImportError('You must have the inotify module installed to ' + 'use the inotify reloader') + + +preferred_reloader = InotifyReloader if has_inotify else Reloader + +reloader_engines = { + 'auto': preferred_reloader, + 'poll': Reloader, + 'inotify': InotifyReloader, +} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/sock.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/sock.py new file mode 100644 index 00000000..eb2b6fa9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/sock.py @@ -0,0 +1,231 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import errno +import os +import socket +import ssl +import stat +import sys +import time + +from gunicorn import util + + +class BaseSocket: + + def __init__(self, address, conf, log, fd=None): + self.log = log + self.conf = conf + + self.cfg_addr = address + if fd is None: + sock = socket.socket(self.FAMILY, socket.SOCK_STREAM) + bound = False + else: + sock = socket.fromfd(fd, self.FAMILY, socket.SOCK_STREAM) + os.close(fd) + bound = True + + self.sock = self.set_options(sock, bound=bound) + + def __str__(self): + return "" % self.sock.fileno() + + def __getattr__(self, name): + return getattr(self.sock, name) + + def set_options(self, sock, bound=False): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + if (self.conf.reuse_port + and hasattr(socket, 'SO_REUSEPORT')): # pragma: no cover + try: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + except OSError as err: + if err.errno not in (errno.ENOPROTOOPT, errno.EINVAL): + raise + if not bound: + self.bind(sock) + sock.setblocking(0) + + # make sure that the socket can be inherited + if hasattr(sock, "set_inheritable"): + sock.set_inheritable(True) + + sock.listen(self.conf.backlog) + return sock + + def bind(self, sock): + sock.bind(self.cfg_addr) + + def close(self): + if self.sock is None: + return + + try: + self.sock.close() + except OSError as e: + self.log.info("Error while closing socket %s", str(e)) + + self.sock = None + + +class TCPSocket(BaseSocket): + + FAMILY = socket.AF_INET + + def __str__(self): + if self.conf.is_ssl: + scheme = "https" + else: + scheme = "http" + + addr = self.sock.getsockname() + return "%s://%s:%d" % (scheme, addr[0], addr[1]) + + def set_options(self, sock, bound=False): + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + return super().set_options(sock, bound=bound) + + +class TCP6Socket(TCPSocket): + + FAMILY = socket.AF_INET6 + + def __str__(self): + (host, port, _, _) = self.sock.getsockname() + return "http://[%s]:%d" % (host, port) + + +class UnixSocket(BaseSocket): + + FAMILY = socket.AF_UNIX + + def __init__(self, addr, conf, log, fd=None): + if fd is None: + try: + st = os.stat(addr) + except OSError as e: + if e.args[0] != errno.ENOENT: + raise + else: + if stat.S_ISSOCK(st.st_mode): + os.remove(addr) + else: + raise ValueError("%r is not a socket" % addr) + super().__init__(addr, conf, log, fd=fd) + + def __str__(self): + return "unix:%s" % self.cfg_addr + + def bind(self, sock): + old_umask = os.umask(self.conf.umask) + sock.bind(self.cfg_addr) + util.chown(self.cfg_addr, self.conf.uid, self.conf.gid) + os.umask(old_umask) + + +def _sock_type(addr): + if isinstance(addr, tuple): + if util.is_ipv6(addr[0]): + sock_type = TCP6Socket + else: + sock_type = TCPSocket + elif isinstance(addr, (str, bytes)): + sock_type = UnixSocket + else: + raise TypeError("Unable to create socket from: %r" % addr) + return sock_type + + +def create_sockets(conf, log, fds=None): + """ + Create a new socket for the configured addresses or file descriptors. + + If a configured address is a tuple then a TCP socket is created. + If it is a string, a Unix socket is created. Otherwise, a TypeError is + raised. + """ + listeners = [] + + # get it only once + addr = conf.address + fdaddr = [bind for bind in addr if isinstance(bind, int)] + if fds: + fdaddr += list(fds) + laddr = [bind for bind in addr if not isinstance(bind, int)] + + # check ssl config early to raise the error on startup + # only the certfile is needed since it can contains the keyfile + if conf.certfile and not os.path.exists(conf.certfile): + raise ValueError('certfile "%s" does not exist' % conf.certfile) + + if conf.keyfile and not os.path.exists(conf.keyfile): + raise ValueError('keyfile "%s" does not exist' % conf.keyfile) + + # sockets are already bound + if fdaddr: + for fd in fdaddr: + sock = socket.fromfd(fd, socket.AF_UNIX, socket.SOCK_STREAM) + sock_name = sock.getsockname() + sock_type = _sock_type(sock_name) + listener = sock_type(sock_name, conf, log, fd=fd) + listeners.append(listener) + + return listeners + + # no sockets is bound, first initialization of gunicorn in this env. + for addr in laddr: + sock_type = _sock_type(addr) + sock = None + for i in range(5): + try: + sock = sock_type(addr, conf, log) + except OSError as e: + if e.args[0] == errno.EADDRINUSE: + log.error("Connection in use: %s", str(addr)) + if e.args[0] == errno.EADDRNOTAVAIL: + log.error("Invalid address: %s", str(addr)) + msg = "connection to {addr} failed: {error}" + log.error(msg.format(addr=str(addr), error=str(e))) + if i < 5: + log.debug("Retrying in 1 second.") + time.sleep(1) + else: + break + + if sock is None: + log.error("Can't connect to %s", str(addr)) + sys.exit(1) + + listeners.append(sock) + + return listeners + + +def close_sockets(listeners, unlink=True): + for sock in listeners: + sock_name = sock.getsockname() + sock.close() + if unlink and _sock_type(sock_name) is UnixSocket: + os.unlink(sock_name) + + +def ssl_context(conf): + def default_ssl_context_factory(): + context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH, cafile=conf.ca_certs) + context.load_cert_chain(certfile=conf.certfile, keyfile=conf.keyfile) + context.verify_mode = conf.cert_reqs + if conf.ciphers: + context.set_ciphers(conf.ciphers) + return context + + return conf.ssl_context(conf, default_ssl_context_factory) + + +def ssl_wrap_socket(sock, conf): + return ssl_context(conf).wrap_socket(sock, + server_side=True, + suppress_ragged_eofs=conf.suppress_ragged_eofs, + do_handshake_on_connect=conf.do_handshake_on_connect) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/systemd.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/systemd.py new file mode 100644 index 00000000..9b185506 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/systemd.py @@ -0,0 +1,75 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import os +import socket + +SD_LISTEN_FDS_START = 3 + + +def listen_fds(unset_environment=True): + """ + Get the number of sockets inherited from systemd socket activation. + + :param unset_environment: clear systemd environment variables unless False + :type unset_environment: bool + :return: the number of sockets to inherit from systemd socket activation + :rtype: int + + Returns zero immediately if $LISTEN_PID is not set to the current pid. + Otherwise, returns the number of systemd activation sockets specified by + $LISTEN_FDS. + + When $LISTEN_PID matches the current pid, unsets the environment variables + unless the ``unset_environment`` flag is ``False``. + + .. note:: + Unlike the sd_listen_fds C function, this implementation does not set + the FD_CLOEXEC flag because the gunicorn arbiter never needs to do this. + + .. seealso:: + ``_ + + """ + fds = int(os.environ.get('LISTEN_FDS', 0)) + listen_pid = int(os.environ.get('LISTEN_PID', 0)) + + if listen_pid != os.getpid(): + return 0 + + if unset_environment: + os.environ.pop('LISTEN_PID', None) + os.environ.pop('LISTEN_FDS', None) + + return fds + + +def sd_notify(state, logger, unset_environment=False): + """Send a notification to systemd. state is a string; see + the man page of sd_notify (http://www.freedesktop.org/software/systemd/man/sd_notify.html) + for a description of the allowable values. + + If the unset_environment parameter is True, sd_notify() will unset + the $NOTIFY_SOCKET environment variable before returning (regardless of + whether the function call itself succeeded or not). Further calls to + sd_notify() will then fail, but the variable is no longer inherited by + child processes. + """ + + addr = os.environ.get('NOTIFY_SOCKET') + if addr is None: + # not run in a service, just a noop + return + try: + sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM | socket.SOCK_CLOEXEC) + if addr[0] == '@': + addr = '\0' + addr[1:] + sock.connect(addr) + sock.sendall(state.encode('utf-8')) + except Exception: + logger.debug("Exception while invoking sd_notify()", exc_info=True) + finally: + if unset_environment: + os.environ.pop('NOTIFY_SOCKET') + sock.close() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/util.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/util.py new file mode 100644 index 00000000..ecd81747 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/util.py @@ -0,0 +1,653 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. +import ast +import email.utils +import errno +import fcntl +import html +import importlib +import inspect +import io +import logging +import os +import pwd +import random +import re +import socket +import sys +import textwrap +import time +import traceback +import warnings + +try: + import importlib.metadata as importlib_metadata +except (ModuleNotFoundError, ImportError): + import importlib_metadata + +from gunicorn.errors import AppImportError +from gunicorn.workers import SUPPORTED_WORKERS +import urllib.parse + +REDIRECT_TO = getattr(os, 'devnull', '/dev/null') + +# Server and Date aren't technically hop-by-hop +# headers, but they are in the purview of the +# origin server which the WSGI spec says we should +# act like. So we drop them and add our own. +# +# In the future, concatenation server header values +# might be better, but nothing else does it and +# dropping them is easier. +hop_headers = set(""" + connection keep-alive proxy-authenticate proxy-authorization + te trailers transfer-encoding upgrade + server date + """.split()) + +try: + from setproctitle import setproctitle + + def _setproctitle(title): + setproctitle("gunicorn: %s" % title) +except ImportError: + def _setproctitle(title): + pass + + +def load_entry_point(distribution, group, name): + dist_obj = importlib_metadata.distribution(distribution) + eps = [ep for ep in dist_obj.entry_points + if ep.group == group and ep.name == name] + if not eps: + raise ImportError("Entry point %r not found" % ((group, name),)) + return eps[0].load() + + +def load_class(uri, default="gunicorn.workers.sync.SyncWorker", + section="gunicorn.workers"): + if inspect.isclass(uri): + return uri + if uri.startswith("egg:"): + # uses entry points + entry_str = uri.split("egg:")[1] + try: + dist, name = entry_str.rsplit("#", 1) + except ValueError: + dist = entry_str + name = default + + try: + return load_entry_point(dist, section, name) + except Exception: + exc = traceback.format_exc() + msg = "class uri %r invalid or not found: \n\n[%s]" + raise RuntimeError(msg % (uri, exc)) + else: + components = uri.split('.') + if len(components) == 1: + while True: + if uri.startswith("#"): + uri = uri[1:] + + if uri in SUPPORTED_WORKERS: + components = SUPPORTED_WORKERS[uri].split(".") + break + + try: + return load_entry_point( + "gunicorn", section, uri + ) + except Exception: + exc = traceback.format_exc() + msg = "class uri %r invalid or not found: \n\n[%s]" + raise RuntimeError(msg % (uri, exc)) + + klass = components.pop(-1) + + try: + mod = importlib.import_module('.'.join(components)) + except Exception: + exc = traceback.format_exc() + msg = "class uri %r invalid or not found: \n\n[%s]" + raise RuntimeError(msg % (uri, exc)) + return getattr(mod, klass) + + +positionals = ( + inspect.Parameter.POSITIONAL_ONLY, + inspect.Parameter.POSITIONAL_OR_KEYWORD, +) + + +def get_arity(f): + sig = inspect.signature(f) + arity = 0 + + for param in sig.parameters.values(): + if param.kind in positionals: + arity += 1 + + return arity + + +def get_username(uid): + """ get the username for a user id""" + return pwd.getpwuid(uid).pw_name + + +def set_owner_process(uid, gid, initgroups=False): + """ set user and group of workers processes """ + + if gid: + if uid: + try: + username = get_username(uid) + except KeyError: + initgroups = False + + # versions of python < 2.6.2 don't manage unsigned int for + # groups like on osx or fedora + gid = abs(gid) & 0x7FFFFFFF + + if initgroups: + os.initgroups(username, gid) + elif gid != os.getgid(): + os.setgid(gid) + + if uid and uid != os.getuid(): + os.setuid(uid) + + +def chown(path, uid, gid): + os.chown(path, uid, gid) + + +if sys.platform.startswith("win"): + def _waitfor(func, pathname, waitall=False): + # Perform the operation + func(pathname) + # Now setup the wait loop + if waitall: + dirname = pathname + else: + dirname, name = os.path.split(pathname) + dirname = dirname or '.' + # Check for `pathname` to be removed from the filesystem. + # The exponential backoff of the timeout amounts to a total + # of ~1 second after which the deletion is probably an error + # anyway. + # Testing on a i7@4.3GHz shows that usually only 1 iteration is + # required when contention occurs. + timeout = 0.001 + while timeout < 1.0: + # Note we are only testing for the existence of the file(s) in + # the contents of the directory regardless of any security or + # access rights. If we have made it this far, we have sufficient + # permissions to do that much using Python's equivalent of the + # Windows API FindFirstFile. + # Other Windows APIs can fail or give incorrect results when + # dealing with files that are pending deletion. + L = os.listdir(dirname) + if not L if waitall else name in L: + return + # Increase the timeout and try again + time.sleep(timeout) + timeout *= 2 + warnings.warn('tests may fail, delete still pending for ' + pathname, + RuntimeWarning, stacklevel=4) + + def _unlink(filename): + _waitfor(os.unlink, filename) +else: + _unlink = os.unlink + + +def unlink(filename): + try: + _unlink(filename) + except OSError as error: + # The filename need not exist. + if error.errno not in (errno.ENOENT, errno.ENOTDIR): + raise + + +def is_ipv6(addr): + try: + socket.inet_pton(socket.AF_INET6, addr) + except OSError: # not a valid address + return False + except ValueError: # ipv6 not supported on this platform + return False + return True + + +def parse_address(netloc, default_port='8000'): + if re.match(r'unix:(//)?', netloc): + return re.split(r'unix:(//)?', netloc)[-1] + + if netloc.startswith("fd://"): + fd = netloc[5:] + try: + return int(fd) + except ValueError: + raise RuntimeError("%r is not a valid file descriptor." % fd) from None + + if netloc.startswith("tcp://"): + netloc = netloc.split("tcp://")[1] + host, port = netloc, default_port + + if '[' in netloc and ']' in netloc: + host = netloc.split(']')[0][1:] + port = (netloc.split(']:') + [default_port])[1] + elif ':' in netloc: + host, port = (netloc.split(':') + [default_port])[:2] + elif netloc == "": + host, port = "0.0.0.0", default_port + + try: + port = int(port) + except ValueError: + raise RuntimeError("%r is not a valid port number." % port) + + return host.lower(), port + + +def close_on_exec(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFD) + flags |= fcntl.FD_CLOEXEC + fcntl.fcntl(fd, fcntl.F_SETFD, flags) + + +def set_non_blocking(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK + fcntl.fcntl(fd, fcntl.F_SETFL, flags) + + +def close(sock): + try: + sock.close() + except OSError: + pass + + +try: + from os import closerange +except ImportError: + def closerange(fd_low, fd_high): + # Iterate through and close all file descriptors. + for fd in range(fd_low, fd_high): + try: + os.close(fd) + except OSError: # ERROR, fd wasn't open to begin with (ignored) + pass + + +def write_chunk(sock, data): + if isinstance(data, str): + data = data.encode('utf-8') + chunk_size = "%X\r\n" % len(data) + chunk = b"".join([chunk_size.encode('utf-8'), data, b"\r\n"]) + sock.sendall(chunk) + + +def write(sock, data, chunked=False): + if chunked: + return write_chunk(sock, data) + sock.sendall(data) + + +def write_nonblock(sock, data, chunked=False): + timeout = sock.gettimeout() + if timeout != 0.0: + try: + sock.setblocking(0) + return write(sock, data, chunked) + finally: + sock.setblocking(1) + else: + return write(sock, data, chunked) + + +def write_error(sock, status_int, reason, mesg): + html_error = textwrap.dedent("""\ + + + %(reason)s + + +

%(reason)s

+ %(mesg)s + + + """) % {"reason": reason, "mesg": html.escape(mesg)} + + http = textwrap.dedent("""\ + HTTP/1.1 %s %s\r + Connection: close\r + Content-Type: text/html\r + Content-Length: %d\r + \r + %s""") % (str(status_int), reason, len(html_error), html_error) + write_nonblock(sock, http.encode('latin1')) + + +def _called_with_wrong_args(f): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the function raised the + error. + + :param f: The function that was called. + :return: ``True`` if the call failed. + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference in Python 2. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def import_app(module): + parts = module.split(":", 1) + if len(parts) == 1: + obj = "application" + else: + module, obj = parts[0], parts[1] + + try: + mod = importlib.import_module(module) + except ImportError: + if module.endswith(".py") and os.path.exists(module): + msg = "Failed to find application, did you mean '%s:%s'?" + raise ImportError(msg % (module.rsplit(".", 1)[0], obj)) + raise + + # Parse obj as a single expression to determine if it's a valid + # attribute name or function call. + try: + expression = ast.parse(obj, mode="eval").body + except SyntaxError: + raise AppImportError( + "Failed to parse %r as an attribute name or function call." % obj + ) + + if isinstance(expression, ast.Name): + name = expression.id + args = kwargs = None + elif isinstance(expression, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expression.func, ast.Name): + raise AppImportError("Function reference must be a simple name: %r" % obj) + + name = expression.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expression.args] + kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expression.keywords} + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise AppImportError( + "Failed to parse arguments as literal values: %r" % obj + ) + else: + raise AppImportError( + "Failed to parse %r as an attribute name or function call." % obj + ) + + is_debug = logging.root.level == logging.DEBUG + try: + app = getattr(mod, name) + except AttributeError: + if is_debug: + traceback.print_exception(*sys.exc_info()) + raise AppImportError("Failed to find attribute %r in %r." % (name, module)) + + # If the expression was a function call, call the retrieved object + # to get the real application. + if args is not None: + try: + app = app(*args, **kwargs) + except TypeError as e: + # If the TypeError was due to bad arguments to the factory + # function, show Python's nice error message without a + # traceback. + if _called_with_wrong_args(app): + raise AppImportError( + "".join(traceback.format_exception_only(TypeError, e)).strip() + ) + + # Otherwise it was raised from within the function, show the + # full traceback. + raise + + if app is None: + raise AppImportError("Failed to find application object: %r" % obj) + + if not callable(app): + raise AppImportError("Application object must be callable.") + return app + + +def getcwd(): + # get current path, try to use PWD env first + try: + a = os.stat(os.environ['PWD']) + b = os.stat(os.getcwd()) + if a.st_ino == b.st_ino and a.st_dev == b.st_dev: + cwd = os.environ['PWD'] + else: + cwd = os.getcwd() + except Exception: + cwd = os.getcwd() + return cwd + + +def http_date(timestamp=None): + """Return the current date and time formatted for a message header.""" + if timestamp is None: + timestamp = time.time() + s = email.utils.formatdate(timestamp, localtime=False, usegmt=True) + return s + + +def is_hoppish(header): + return header.lower().strip() in hop_headers + + +def daemonize(enable_stdio_inheritance=False): + """\ + Standard daemonization of a process. + http://www.faqs.org/faqs/unix-faq/programmer/faq/ section 1.7 + """ + if 'GUNICORN_FD' not in os.environ: + if os.fork(): + os._exit(0) + os.setsid() + + if os.fork(): + os._exit(0) + + os.umask(0o22) + + # In both the following any file descriptors above stdin + # stdout and stderr are left untouched. The inheritance + # option simply allows one to have output go to a file + # specified by way of shell redirection when not wanting + # to use --error-log option. + + if not enable_stdio_inheritance: + # Remap all of stdin, stdout and stderr on to + # /dev/null. The expectation is that users have + # specified the --error-log option. + + closerange(0, 3) + + fd_null = os.open(REDIRECT_TO, os.O_RDWR) + # PEP 446, make fd for /dev/null inheritable + os.set_inheritable(fd_null, True) + + # expect fd_null to be always 0 here, but in-case not ... + if fd_null != 0: + os.dup2(fd_null, 0) + + os.dup2(fd_null, 1) + os.dup2(fd_null, 2) + + else: + fd_null = os.open(REDIRECT_TO, os.O_RDWR) + + # Always redirect stdin to /dev/null as we would + # never expect to need to read interactive input. + + if fd_null != 0: + os.close(0) + os.dup2(fd_null, 0) + + # If stdout and stderr are still connected to + # their original file descriptors we check to see + # if they are associated with terminal devices. + # When they are we map them to /dev/null so that + # are still detached from any controlling terminal + # properly. If not we preserve them as they are. + # + # If stdin and stdout were not hooked up to the + # original file descriptors, then all bets are + # off and all we can really do is leave them as + # they were. + # + # This will allow 'gunicorn ... > output.log 2>&1' + # to work with stdout/stderr going to the file + # as expected. + # + # Note that if using --error-log option, the log + # file specified through shell redirection will + # only be used up until the log file specified + # by the option takes over. As it replaces stdout + # and stderr at the file descriptor level, then + # anything using stdout or stderr, including having + # cached a reference to them, will still work. + + def redirect(stream, fd_expect): + try: + fd = stream.fileno() + if fd == fd_expect and stream.isatty(): + os.close(fd) + os.dup2(fd_null, fd) + except AttributeError: + pass + + redirect(sys.stdout, 1) + redirect(sys.stderr, 2) + + +def seed(): + try: + random.seed(os.urandom(64)) + except NotImplementedError: + random.seed('%s.%s' % (time.time(), os.getpid())) + + +def check_is_writable(path): + try: + with open(path, 'a') as f: + f.close() + except OSError as e: + raise RuntimeError("Error: '%s' isn't writable [%r]" % (path, e)) + + +def to_bytestring(value, encoding="utf8"): + """Converts a string argument to a byte string""" + if isinstance(value, bytes): + return value + if not isinstance(value, str): + raise TypeError('%r is not a string' % value) + + return value.encode(encoding) + + +def has_fileno(obj): + if not hasattr(obj, "fileno"): + return False + + # check BytesIO case and maybe others + try: + obj.fileno() + except (AttributeError, OSError, io.UnsupportedOperation): + return False + + return True + + +def warn(msg): + print("!!!", file=sys.stderr) + + lines = msg.splitlines() + for i, line in enumerate(lines): + if i == 0: + line = "WARNING: %s" % line + print("!!! %s" % line, file=sys.stderr) + + print("!!!\n", file=sys.stderr) + sys.stderr.flush() + + +def make_fail_app(msg): + msg = to_bytestring(msg) + + def app(environ, start_response): + start_response("500 Internal Server Error", [ + ("Content-Type", "text/plain"), + ("Content-Length", str(len(msg))) + ]) + return [msg] + + return app + + +def split_request_uri(uri): + if uri.startswith("//"): + # When the path starts with //, urlsplit considers it as a + # relative uri while the RFC says we should consider it as abs_path + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2 + # We use temporary dot prefix to workaround this behaviour + parts = urllib.parse.urlsplit("." + uri) + return parts._replace(path=parts.path[1:]) + + return urllib.parse.urlsplit(uri) + + +# From six.reraise +def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + + +def bytes_to_str(b): + if isinstance(b, str): + return b + return str(b, 'latin1') + + +def unquote_to_wsgi_str(string): + return urllib.parse.unquote_to_bytes(string).decode('latin-1') diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__init__.py new file mode 100644 index 00000000..3da5f85e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__init__.py @@ -0,0 +1,14 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# supported gunicorn workers. +SUPPORTED_WORKERS = { + "sync": "gunicorn.workers.sync.SyncWorker", + "eventlet": "gunicorn.workers.geventlet.EventletWorker", + "gevent": "gunicorn.workers.ggevent.GeventWorker", + "gevent_wsgi": "gunicorn.workers.ggevent.GeventPyWSGIWorker", + "gevent_pywsgi": "gunicorn.workers.ggevent.GeventPyWSGIWorker", + "tornado": "gunicorn.workers.gtornado.TornadoWorker", + "gthread": "gunicorn.workers.gthread.ThreadWorker", +} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..311fe12691047070b93b8dc75fb0e5763925d5e1 GIT binary patch literal 580 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/geventlet.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/geventlet.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483410490883ab762b5ba7a63b3b8b29554b4964 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/gthread.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/gthread.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c97073a031fc947e2e429ef05294935e2a691f4 GIT binary patch literal 18994 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fbb03647495dbb87881bb56b84f54b56a265769 GIT binary patch literal 8041 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/sync.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/sync.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08a3acffedbc8689a53ef9e860a9e0e1fdbffa08 GIT binary patch literal 10679 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 KPv{@I_x}b~4K6(Z literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/workertmp.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/__pycache__/workertmp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a04db240d95b2b0e66709f8e9c244341b83c255 GIT binary patch literal 2949 zcmcImT}&HC5Z?Q<&)DR^CJ6*u?2tc)f|HasX`3IVAq_+cZ3qh8P6>-=tyA$<}o=6h2NZInRhX$8`#NGuGw@6oXHCZa``V&w3 z!j#Eo3?*s0E(~27?Cp!$CN{130GmhAya;4~qeYQYcL9o%MwFEpL^bT> zVQgs<=sLEKglD@3owfy;zRU2Eb&1L|Ipl$ydWSM<$y#C;ksL13dFBg-0Q~{VYLcDg zUXUkEyi+*mI>#H4s`mSd&f%mO#!dpDhmeN`XN^cz9`+EO!>c{OcB6@`B=!->;dyT7 z7 z9RP4IRb6j~$cn@BtaIueFb*b|Aux^}N?$H~P!CF)tgDBOpgf`IMrZIs6i;GMjv8`s z+$we>mF~>djE`hgC8j~OBTSpFG?e4Ygvm$>%rWEbHz2O_aDz!}y2)iyQGLwZW$zZz zb`hDGY&vR;nw+BJiLXDS8cIsO2%!c|-jGx2xRR7jcWO+>6O+j(lIb3i4H*l}2$>-P zVpL2nHmZ%Qrl&B%L)zHTBib<0m4zV#pooXlyJxBI^-?W5mWsuW*cV zI&1QxsHln|iaGyQtLY><{7Cda5SapN4SR|`vpo;4&kxNFl^YIEdsYSiiV!LZp=tIP zukZ;y@1Aqd*Ur^0NXw1wYyOv)S}*@NP-?wa_V+LO`qu)@D}lCBpzY!5?*^6wZx{G! zdb)d!ubJTs{Qah7zImMoK4Io$;pE3Riiz38N6E+D{R^?rM?M|-#{ccUul9Z2^7zo1 zHDBG#<-+Cr1`1?wZqQy|_I0kic#r?rK+9TPL(x0yebBvJ7y8QunwsZ5bDo9$3-ZHj z<;KW#_lLdztO<=9fcE&;e7k0P3O)Dx?_F8-)vt3%^-Ra#i0@CG>^=s5I2OEE$HcZe zD_Ype5356y!FPu3lt*y@~)j(E&dc`8nm-bjHgctrK#D#HbC zdQzII85(*!5PwS1>%eM=I}oZ=RP(A9rr}F?%B%9Yh*x#|nu0;tW*MRFN<5pZbLzp? z;E$Kyi3qBOz~187*|X(9+cZz^u%XyA+q6<2D%FR|^=%8IU-C-_-}sq-a}(_V&*6x_ zHuz0#rV)7&jtC!YzilMk+Z1R@@FCr2CtR-sh&xu8tAG>Nji_OP195sLuNz_tL-L5S zFw*h;SAg**(UTK1X$iHe+-?V*Dm6w&KY$2=NT{EgC`>$HaRsh49w{{*DK{Q13+*dH zS4rqv;=5o6GJFmgd<_;buOp!dQ0j%+ZIIMSdbE=gJdSLu(y;QZzFfN|EUVqf zbPB8rfthR}yCSrfgx0bUTH-_hf2jDI_McF(GAB4lTm7^P=M$)obmn&9c3B86@j)xj zzA%s58t$p0Xx4~gN|Q24Ec-<9W+s}nS0KJ8_zET`Fv0f^@rjRs<;Hpq5I1Fu;GYwE zGa`4v2D^vzZyck!w>Ef+du_u-ar-wBv0<{T!(OYv;9<1Eu!Kv-3hWtw+D_{%Jd1R=Om!@* zGZaN_)&Q#J3GhAv0{Z(MH2vn?H+^d6T;W{V+cL$k`WjYzttDUU0$=upr#yeV4pN~F IfQaS)UuMTeAOHXW literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base.py new file mode 100644 index 00000000..93c465c9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base.py @@ -0,0 +1,287 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import io +import os +import signal +import sys +import time +import traceback +from datetime import datetime +from random import randint +from ssl import SSLError + +from gunicorn import util +from gunicorn.http.errors import ( + ForbiddenProxyRequest, InvalidHeader, + InvalidHeaderName, InvalidHTTPVersion, + InvalidProxyLine, InvalidRequestLine, + InvalidRequestMethod, InvalidSchemeHeaders, + LimitRequestHeaders, LimitRequestLine, + UnsupportedTransferCoding, + ConfigurationProblem, ObsoleteFolding, +) +from gunicorn.http.wsgi import Response, default_environ +from gunicorn.reloader import reloader_engines +from gunicorn.workers.workertmp import WorkerTmp + + +class Worker: + + SIGNALS = [getattr(signal, "SIG%s" % x) for x in ( + "ABRT HUP QUIT INT TERM USR1 USR2 WINCH CHLD".split() + )] + + PIPE = [] + + def __init__(self, age, ppid, sockets, app, timeout, cfg, log): + """\ + This is called pre-fork so it shouldn't do anything to the + current process. If there's a need to make process wide + changes you'll want to do that in ``self.init_process()``. + """ + self.age = age + self.pid = "[booting]" + self.ppid = ppid + self.sockets = sockets + self.app = app + self.timeout = timeout + self.cfg = cfg + self.booted = False + self.aborted = False + self.reloader = None + + self.nr = 0 + + if cfg.max_requests > 0: + jitter = randint(0, cfg.max_requests_jitter) + self.max_requests = cfg.max_requests + jitter + else: + self.max_requests = sys.maxsize + + self.alive = True + self.log = log + self.tmp = WorkerTmp(cfg) + + def __str__(self): + return "" % self.pid + + def notify(self): + """\ + Your worker subclass must arrange to have this method called + once every ``self.timeout`` seconds. If you fail in accomplishing + this task, the master process will murder your workers. + """ + self.tmp.notify() + + def run(self): + """\ + This is the mainloop of a worker process. You should override + this method in a subclass to provide the intended behaviour + for your particular evil schemes. + """ + raise NotImplementedError() + + def init_process(self): + """\ + If you override this method in a subclass, the last statement + in the function should be to call this method with + super().init_process() so that the ``run()`` loop is initiated. + """ + + # set environment' variables + if self.cfg.env: + for k, v in self.cfg.env.items(): + os.environ[k] = v + + util.set_owner_process(self.cfg.uid, self.cfg.gid, + initgroups=self.cfg.initgroups) + + # Reseed the random number generator + util.seed() + + # For waking ourselves up + self.PIPE = os.pipe() + for p in self.PIPE: + util.set_non_blocking(p) + util.close_on_exec(p) + + # Prevent fd inheritance + for s in self.sockets: + util.close_on_exec(s) + util.close_on_exec(self.tmp.fileno()) + + self.wait_fds = self.sockets + [self.PIPE[0]] + + self.log.close_on_exec() + + self.init_signals() + + # start the reloader + if self.cfg.reload: + def changed(fname): + self.log.info("Worker reloading: %s modified", fname) + self.alive = False + os.write(self.PIPE[1], b"1") + self.cfg.worker_int(self) + time.sleep(0.1) + sys.exit(0) + + reloader_cls = reloader_engines[self.cfg.reload_engine] + self.reloader = reloader_cls(extra_files=self.cfg.reload_extra_files, + callback=changed) + + self.load_wsgi() + if self.reloader: + self.reloader.start() + + self.cfg.post_worker_init(self) + + # Enter main run loop + self.booted = True + self.run() + + def load_wsgi(self): + try: + self.wsgi = self.app.wsgi() + except SyntaxError as e: + if not self.cfg.reload: + raise + + self.log.exception(e) + + # fix from PR #1228 + # storing the traceback into exc_tb will create a circular reference. + # per https://docs.python.org/2/library/sys.html#sys.exc_info warning, + # delete the traceback after use. + try: + _, exc_val, exc_tb = sys.exc_info() + self.reloader.add_extra_file(exc_val.filename) + + tb_string = io.StringIO() + traceback.print_tb(exc_tb, file=tb_string) + self.wsgi = util.make_fail_app(tb_string.getvalue()) + finally: + del exc_tb + + def init_signals(self): + # reset signaling + for s in self.SIGNALS: + signal.signal(s, signal.SIG_DFL) + # init new signaling + signal.signal(signal.SIGQUIT, self.handle_quit) + signal.signal(signal.SIGTERM, self.handle_exit) + signal.signal(signal.SIGINT, self.handle_quit) + signal.signal(signal.SIGWINCH, self.handle_winch) + signal.signal(signal.SIGUSR1, self.handle_usr1) + signal.signal(signal.SIGABRT, self.handle_abort) + + # Don't let SIGTERM and SIGUSR1 disturb active requests + # by interrupting system calls + signal.siginterrupt(signal.SIGTERM, False) + signal.siginterrupt(signal.SIGUSR1, False) + + if hasattr(signal, 'set_wakeup_fd'): + signal.set_wakeup_fd(self.PIPE[1]) + + def handle_usr1(self, sig, frame): + self.log.reopen_files() + + def handle_exit(self, sig, frame): + self.alive = False + + def handle_quit(self, sig, frame): + self.alive = False + # worker_int callback + self.cfg.worker_int(self) + time.sleep(0.1) + sys.exit(0) + + def handle_abort(self, sig, frame): + self.alive = False + self.cfg.worker_abort(self) + sys.exit(1) + + def handle_error(self, req, client, addr, exc): + request_start = datetime.now() + addr = addr or ('', -1) # unix socket case + if isinstance(exc, ( + InvalidRequestLine, InvalidRequestMethod, + InvalidHTTPVersion, InvalidHeader, InvalidHeaderName, + LimitRequestLine, LimitRequestHeaders, + InvalidProxyLine, ForbiddenProxyRequest, + InvalidSchemeHeaders, UnsupportedTransferCoding, + ConfigurationProblem, ObsoleteFolding, + SSLError, + )): + + status_int = 400 + reason = "Bad Request" + + if isinstance(exc, InvalidRequestLine): + mesg = "Invalid Request Line '%s'" % str(exc) + elif isinstance(exc, InvalidRequestMethod): + mesg = "Invalid Method '%s'" % str(exc) + elif isinstance(exc, InvalidHTTPVersion): + mesg = "Invalid HTTP Version '%s'" % str(exc) + elif isinstance(exc, UnsupportedTransferCoding): + mesg = "%s" % str(exc) + status_int = 501 + elif isinstance(exc, ConfigurationProblem): + mesg = "%s" % str(exc) + status_int = 500 + elif isinstance(exc, ObsoleteFolding): + mesg = "%s" % str(exc) + elif isinstance(exc, (InvalidHeaderName, InvalidHeader,)): + mesg = "%s" % str(exc) + if not req and hasattr(exc, "req"): + req = exc.req # for access log + elif isinstance(exc, LimitRequestLine): + mesg = "%s" % str(exc) + elif isinstance(exc, LimitRequestHeaders): + reason = "Request Header Fields Too Large" + mesg = "Error parsing headers: '%s'" % str(exc) + status_int = 431 + elif isinstance(exc, InvalidProxyLine): + mesg = "'%s'" % str(exc) + elif isinstance(exc, ForbiddenProxyRequest): + reason = "Forbidden" + mesg = "Request forbidden" + status_int = 403 + elif isinstance(exc, InvalidSchemeHeaders): + mesg = "%s" % str(exc) + elif isinstance(exc, SSLError): + reason = "Forbidden" + mesg = "'%s'" % str(exc) + status_int = 403 + + msg = "Invalid request from ip={ip}: {error}" + self.log.warning(msg.format(ip=addr[0], error=str(exc))) + else: + if hasattr(req, "uri"): + self.log.exception("Error handling request %s", req.uri) + else: + self.log.exception("Error handling request (no URI read)") + status_int = 500 + reason = "Internal Server Error" + mesg = "" + + if req is not None: + request_time = datetime.now() - request_start + environ = default_environ(req, client, self.cfg) + environ['REMOTE_ADDR'] = addr[0] + environ['REMOTE_PORT'] = str(addr[1]) + resp = Response(req, client, self.cfg) + resp.status = "%s %s" % (status_int, reason) + resp.response_length = len(mesg) + self.log.access(resp, req, environ, request_time) + + try: + util.write_error(client, status_int, reason, mesg) + except Exception: + self.log.debug("Failed to send error message.") + + def handle_winch(self, sig, fname): + # Ignore SIGWINCH in worker. Fixes a crash on OpenBSD. + self.log.debug("worker: SIGWINCH ignored.") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base_async.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base_async.py new file mode 100644 index 00000000..9466d6aa --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/base_async.py @@ -0,0 +1,147 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +from datetime import datetime +import errno +import socket +import ssl +import sys + +from gunicorn import http +from gunicorn.http import wsgi +from gunicorn import util +from gunicorn.workers import base + +ALREADY_HANDLED = object() + + +class AsyncWorker(base.Worker): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.worker_connections = self.cfg.worker_connections + + def timeout_ctx(self): + raise NotImplementedError() + + def is_already_handled(self, respiter): + # some workers will need to overload this function to raise a StopIteration + return respiter == ALREADY_HANDLED + + def handle(self, listener, client, addr): + req = None + try: + parser = http.RequestParser(self.cfg, client, addr) + try: + listener_name = listener.getsockname() + if not self.cfg.keepalive: + req = next(parser) + self.handle_request(listener_name, req, client, addr) + else: + # keepalive loop + proxy_protocol_info = {} + while True: + req = None + with self.timeout_ctx(): + req = next(parser) + if not req: + break + if req.proxy_protocol_info: + proxy_protocol_info = req.proxy_protocol_info + else: + req.proxy_protocol_info = proxy_protocol_info + self.handle_request(listener_name, req, client, addr) + except http.errors.NoMoreData as e: + self.log.debug("Ignored premature client disconnection. %s", e) + except StopIteration as e: + self.log.debug("Closing connection. %s", e) + except ssl.SSLError: + # pass to next try-except level + util.reraise(*sys.exc_info()) + except OSError: + # pass to next try-except level + util.reraise(*sys.exc_info()) + except Exception as e: + self.handle_error(req, client, addr, e) + except ssl.SSLError as e: + if e.args[0] == ssl.SSL_ERROR_EOF: + self.log.debug("ssl connection closed") + client.close() + else: + self.log.debug("Error processing SSL request.") + self.handle_error(req, client, addr, e) + except OSError as e: + if e.errno not in (errno.EPIPE, errno.ECONNRESET, errno.ENOTCONN): + self.log.exception("Socket error processing request.") + else: + if e.errno == errno.ECONNRESET: + self.log.debug("Ignoring connection reset") + elif e.errno == errno.ENOTCONN: + self.log.debug("Ignoring socket not connected") + else: + self.log.debug("Ignoring EPIPE") + except BaseException as e: + self.handle_error(req, client, addr, e) + finally: + util.close(client) + + def handle_request(self, listener_name, req, sock, addr): + request_start = datetime.now() + environ = {} + resp = None + try: + self.cfg.pre_request(self, req) + resp, environ = wsgi.create(req, sock, addr, + listener_name, self.cfg) + environ["wsgi.multithread"] = True + self.nr += 1 + if self.nr >= self.max_requests: + if self.alive: + self.log.info("Autorestarting worker after current request.") + self.alive = False + + if not self.alive or not self.cfg.keepalive: + resp.force_close() + + respiter = self.wsgi(environ, resp.start_response) + if self.is_already_handled(respiter): + return False + try: + if isinstance(respiter, environ['wsgi.file_wrapper']): + resp.write_file(respiter) + else: + for item in respiter: + resp.write(item) + resp.close() + finally: + request_time = datetime.now() - request_start + self.log.access(resp, req, environ, request_time) + if hasattr(respiter, "close"): + respiter.close() + if resp.should_close(): + raise StopIteration() + except StopIteration: + raise + except OSError: + # If the original exception was a socket.error we delegate + # handling it to the caller (where handle() might ignore it) + util.reraise(*sys.exc_info()) + except Exception: + if resp and resp.headers_sent: + # If the requests have already been sent, we should close the + # connection to indicate the error. + self.log.exception("Error handling request") + try: + sock.shutdown(socket.SHUT_RDWR) + sock.close() + except OSError: + pass + raise StopIteration() + raise + finally: + try: + self.cfg.post_request(self, req, environ, resp) + except Exception: + self.log.exception("Exception in post_request hook") + return True diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/geventlet.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/geventlet.py new file mode 100644 index 00000000..087eb61e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/geventlet.py @@ -0,0 +1,186 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +from functools import partial +import sys + +try: + import eventlet +except ImportError: + raise RuntimeError("eventlet worker requires eventlet 0.24.1 or higher") +else: + from packaging.version import parse as parse_version + if parse_version(eventlet.__version__) < parse_version('0.24.1'): + raise RuntimeError("eventlet worker requires eventlet 0.24.1 or higher") + +from eventlet import hubs, greenthread +from eventlet.greenio import GreenSocket +import eventlet.wsgi +import greenlet + +from gunicorn.workers.base_async import AsyncWorker +from gunicorn.sock import ssl_wrap_socket + +# ALREADY_HANDLED is removed in 0.30.3+ now it's `WSGI_LOCAL.already_handled: bool` +# https://github.com/eventlet/eventlet/pull/544 +EVENTLET_WSGI_LOCAL = getattr(eventlet.wsgi, "WSGI_LOCAL", None) +EVENTLET_ALREADY_HANDLED = getattr(eventlet.wsgi, "ALREADY_HANDLED", None) + + +def _eventlet_socket_sendfile(self, file, offset=0, count=None): + # Based on the implementation in gevent which in turn is slightly + # modified from the standard library implementation. + if self.gettimeout() == 0: + raise ValueError("non-blocking sockets are not supported") + if offset: + file.seek(offset) + blocksize = min(count, 8192) if count else 8192 + total_sent = 0 + # localize variable access to minimize overhead + file_read = file.read + sock_send = self.send + try: + while True: + if count: + blocksize = min(count - total_sent, blocksize) + if blocksize <= 0: + break + data = memoryview(file_read(blocksize)) + if not data: + break # EOF + while True: + try: + sent = sock_send(data) + except BlockingIOError: + continue + else: + total_sent += sent + if sent < len(data): + data = data[sent:] + else: + break + return total_sent + finally: + if total_sent > 0 and hasattr(file, 'seek'): + file.seek(offset + total_sent) + + +def _eventlet_serve(sock, handle, concurrency): + """ + Serve requests forever. + + This code is nearly identical to ``eventlet.convenience.serve`` except + that it attempts to join the pool at the end, which allows for gunicorn + graceful shutdowns. + """ + pool = eventlet.greenpool.GreenPool(concurrency) + server_gt = eventlet.greenthread.getcurrent() + + while True: + try: + conn, addr = sock.accept() + gt = pool.spawn(handle, conn, addr) + gt.link(_eventlet_stop, server_gt, conn) + conn, addr, gt = None, None, None + except eventlet.StopServe: + sock.close() + pool.waitall() + return + + +def _eventlet_stop(client, server, conn): + """ + Stop a greenlet handling a request and close its connection. + + This code is lifted from eventlet so as not to depend on undocumented + functions in the library. + """ + try: + try: + client.wait() + finally: + conn.close() + except greenlet.GreenletExit: + pass + except Exception: + greenthread.kill(server, *sys.exc_info()) + + +def patch_sendfile(): + # As of eventlet 0.25.1, GreenSocket.sendfile doesn't exist, + # meaning the native implementations of socket.sendfile will be used. + # If os.sendfile exists, it will attempt to use that, failing explicitly + # if the socket is in non-blocking mode, which the underlying + # socket object /is/. Even the regular _sendfile_use_send will + # fail in that way; plus, it would use the underlying socket.send which isn't + # properly cooperative. So we have to monkey-patch a working socket.sendfile() + # into GreenSocket; in this method, `self.send` will be the GreenSocket's + # send method which is properly cooperative. + if not hasattr(GreenSocket, 'sendfile'): + GreenSocket.sendfile = _eventlet_socket_sendfile + + +class EventletWorker(AsyncWorker): + + def patch(self): + hubs.use_hub() + eventlet.monkey_patch() + patch_sendfile() + + def is_already_handled(self, respiter): + # eventlet >= 0.30.3 + if getattr(EVENTLET_WSGI_LOCAL, "already_handled", None): + raise StopIteration() + # eventlet < 0.30.3 + if respiter == EVENTLET_ALREADY_HANDLED: + raise StopIteration() + return super().is_already_handled(respiter) + + def init_process(self): + self.patch() + super().init_process() + + def handle_quit(self, sig, frame): + eventlet.spawn(super().handle_quit, sig, frame) + + def handle_usr1(self, sig, frame): + eventlet.spawn(super().handle_usr1, sig, frame) + + def timeout_ctx(self): + return eventlet.Timeout(self.cfg.keepalive or None, False) + + def handle(self, listener, client, addr): + if self.cfg.is_ssl: + client = ssl_wrap_socket(client, self.cfg) + super().handle(listener, client, addr) + + def run(self): + acceptors = [] + for sock in self.sockets: + gsock = GreenSocket(sock) + gsock.setblocking(1) + hfun = partial(self.handle, gsock) + acceptor = eventlet.spawn(_eventlet_serve, gsock, hfun, + self.worker_connections) + + acceptors.append(acceptor) + eventlet.sleep(0.0) + + while self.alive: + self.notify() + eventlet.sleep(1.0) + + self.notify() + t = None + try: + with eventlet.Timeout(self.cfg.graceful_timeout) as t: + for a in acceptors: + a.kill(eventlet.StopServe()) + for a in acceptors: + a.wait() + except eventlet.Timeout as te: + if te != t: + raise + for a in acceptors: + a.kill() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/ggevent.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/ggevent.py new file mode 100644 index 00000000..b9b9b440 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/ggevent.py @@ -0,0 +1,193 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import os +import sys +from datetime import datetime +from functools import partial +import time + +try: + import gevent +except ImportError: + raise RuntimeError("gevent worker requires gevent 1.4 or higher") +else: + from packaging.version import parse as parse_version + if parse_version(gevent.__version__) < parse_version('1.4'): + raise RuntimeError("gevent worker requires gevent 1.4 or higher") + +from gevent.pool import Pool +from gevent.server import StreamServer +from gevent import hub, monkey, socket, pywsgi + +import gunicorn +from gunicorn.http.wsgi import base_environ +from gunicorn.sock import ssl_context +from gunicorn.workers.base_async import AsyncWorker + +VERSION = "gevent/%s gunicorn/%s" % (gevent.__version__, gunicorn.__version__) + + +class GeventWorker(AsyncWorker): + + server_class = None + wsgi_handler = None + + def patch(self): + monkey.patch_all() + + # patch sockets + sockets = [] + for s in self.sockets: + sockets.append(socket.socket(s.FAMILY, socket.SOCK_STREAM, + fileno=s.sock.fileno())) + self.sockets = sockets + + def notify(self): + super().notify() + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s", self) + sys.exit(0) + + def timeout_ctx(self): + return gevent.Timeout(self.cfg.keepalive, False) + + def run(self): + servers = [] + ssl_args = {} + + if self.cfg.is_ssl: + ssl_args = {"ssl_context": ssl_context(self.cfg)} + + for s in self.sockets: + s.setblocking(1) + pool = Pool(self.worker_connections) + if self.server_class is not None: + environ = base_environ(self.cfg) + environ.update({ + "wsgi.multithread": True, + "SERVER_SOFTWARE": VERSION, + }) + server = self.server_class( + s, application=self.wsgi, spawn=pool, log=self.log, + handler_class=self.wsgi_handler, environ=environ, + **ssl_args) + else: + hfun = partial(self.handle, s) + server = StreamServer(s, handle=hfun, spawn=pool, **ssl_args) + if self.cfg.workers > 1: + server.max_accept = 1 + + server.start() + servers.append(server) + + while self.alive: + self.notify() + gevent.sleep(1.0) + + try: + # Stop accepting requests + for server in servers: + if hasattr(server, 'close'): # gevent 1.0 + server.close() + if hasattr(server, 'kill'): # gevent < 1.0 + server.kill() + + # Handle current requests until graceful_timeout + ts = time.time() + while time.time() - ts <= self.cfg.graceful_timeout: + accepting = 0 + for server in servers: + if server.pool.free_count() != server.pool.size: + accepting += 1 + + # if no server is accepting a connection, we can exit + if not accepting: + return + + self.notify() + gevent.sleep(1.0) + + # Force kill all active the handlers + self.log.warning("Worker graceful timeout (pid:%s)", self.pid) + for server in servers: + server.stop(timeout=1) + except Exception: + pass + + def handle(self, listener, client, addr): + # Connected socket timeout defaults to socket.getdefaulttimeout(). + # This forces to blocking mode. + client.setblocking(1) + super().handle(listener, client, addr) + + def handle_request(self, listener_name, req, sock, addr): + try: + super().handle_request(listener_name, req, sock, addr) + except gevent.GreenletExit: + pass + except SystemExit: + pass + + def handle_quit(self, sig, frame): + # Move this out of the signal handler so we can use + # blocking calls. See #1126 + gevent.spawn(super().handle_quit, sig, frame) + + def handle_usr1(self, sig, frame): + # Make the gevent workers handle the usr1 signal + # by deferring to a new greenlet. See #1645 + gevent.spawn(super().handle_usr1, sig, frame) + + def init_process(self): + self.patch() + hub.reinit() + super().init_process() + + +class GeventResponse: + + status = None + headers = None + sent = None + + def __init__(self, status, headers, clength): + self.status = status + self.headers = headers + self.sent = clength + + +class PyWSGIHandler(pywsgi.WSGIHandler): + + def log_request(self): + start = datetime.fromtimestamp(self.time_start) + finish = datetime.fromtimestamp(self.time_finish) + response_time = finish - start + resp_headers = getattr(self, 'response_headers', {}) + + # Status is expected to be a string but is encoded to bytes in gevent for PY3 + # Except when it isn't because gevent uses hardcoded strings for network errors. + status = self.status.decode() if isinstance(self.status, bytes) else self.status + resp = GeventResponse(status, resp_headers, self.response_length) + if hasattr(self, 'headers'): + req_headers = self.headers.items() + else: + req_headers = [] + self.server.log.access(resp, req_headers, self.environ, response_time) + + def get_environ(self): + env = super().get_environ() + env['gunicorn.sock'] = self.socket + env['RAW_URI'] = self.path + return env + + +class PyWSGIServer(pywsgi.WSGIServer): + pass + + +class GeventPyWSGIWorker(GeventWorker): + "The Gevent StreamServer based workers." + server_class = PyWSGIServer + wsgi_handler = PyWSGIHandler diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gthread.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gthread.py new file mode 100644 index 00000000..7a23228c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gthread.py @@ -0,0 +1,372 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# design: +# A threaded worker accepts connections in the main loop, accepted +# connections are added to the thread pool as a connection job. +# Keepalive connections are put back in the loop waiting for an event. +# If no event happen after the keep alive timeout, the connection is +# closed. +# pylint: disable=no-else-break + +from concurrent import futures +import errno +import os +import selectors +import socket +import ssl +import sys +import time +from collections import deque +from datetime import datetime +from functools import partial +from threading import RLock + +from . import base +from .. import http +from .. import util +from .. import sock +from ..http import wsgi + + +class TConn: + + def __init__(self, cfg, sock, client, server): + self.cfg = cfg + self.sock = sock + self.client = client + self.server = server + + self.timeout = None + self.parser = None + self.initialized = False + + # set the socket to non blocking + self.sock.setblocking(False) + + def init(self): + self.initialized = True + self.sock.setblocking(True) + + if self.parser is None: + # wrap the socket if needed + if self.cfg.is_ssl: + self.sock = sock.ssl_wrap_socket(self.sock, self.cfg) + + # initialize the parser + self.parser = http.RequestParser(self.cfg, self.sock, self.client) + + def set_timeout(self): + # set the timeout + self.timeout = time.time() + self.cfg.keepalive + + def close(self): + util.close(self.sock) + + +class ThreadWorker(base.Worker): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.worker_connections = self.cfg.worker_connections + self.max_keepalived = self.cfg.worker_connections - self.cfg.threads + # initialise the pool + self.tpool = None + self.poller = None + self._lock = None + self.futures = deque() + self._keep = deque() + self.nr_conns = 0 + + @classmethod + def check_config(cls, cfg, log): + max_keepalived = cfg.worker_connections - cfg.threads + + if max_keepalived <= 0 and cfg.keepalive: + log.warning("No keepalived connections can be handled. " + + "Check the number of worker connections and threads.") + + def init_process(self): + self.tpool = self.get_thread_pool() + self.poller = selectors.DefaultSelector() + self._lock = RLock() + super().init_process() + + def get_thread_pool(self): + """Override this method to customize how the thread pool is created""" + return futures.ThreadPoolExecutor(max_workers=self.cfg.threads) + + def handle_quit(self, sig, frame): + self.alive = False + # worker_int callback + self.cfg.worker_int(self) + self.tpool.shutdown(False) + time.sleep(0.1) + sys.exit(0) + + def _wrap_future(self, fs, conn): + fs.conn = conn + self.futures.append(fs) + fs.add_done_callback(self.finish_request) + + def enqueue_req(self, conn): + conn.init() + # submit the connection to a worker + fs = self.tpool.submit(self.handle, conn) + self._wrap_future(fs, conn) + + def accept(self, server, listener): + try: + sock, client = listener.accept() + # initialize the connection object + conn = TConn(self.cfg, sock, client, server) + + self.nr_conns += 1 + # wait until socket is readable + with self._lock: + self.poller.register(conn.sock, selectors.EVENT_READ, + partial(self.on_client_socket_readable, conn)) + except OSError as e: + if e.errno not in (errno.EAGAIN, errno.ECONNABORTED, + errno.EWOULDBLOCK): + raise + + def on_client_socket_readable(self, conn, client): + with self._lock: + # unregister the client from the poller + self.poller.unregister(client) + + if conn.initialized: + # remove the connection from keepalive + try: + self._keep.remove(conn) + except ValueError: + # race condition + return + + # submit the connection to a worker + self.enqueue_req(conn) + + def murder_keepalived(self): + now = time.time() + while True: + with self._lock: + try: + # remove the connection from the queue + conn = self._keep.popleft() + except IndexError: + break + + delta = conn.timeout - now + if delta > 0: + # add the connection back to the queue + with self._lock: + self._keep.appendleft(conn) + break + else: + self.nr_conns -= 1 + # remove the socket from the poller + with self._lock: + try: + self.poller.unregister(conn.sock) + except OSError as e: + if e.errno != errno.EBADF: + raise + except KeyError: + # already removed by the system, continue + pass + except ValueError: + # already removed by the system continue + pass + + # close the socket + conn.close() + + def is_parent_alive(self): + # If our parent changed then we shut down. + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s", self) + return False + return True + + def run(self): + # init listeners, add them to the event loop + for sock in self.sockets: + sock.setblocking(False) + # a race condition during graceful shutdown may make the listener + # name unavailable in the request handler so capture it once here + server = sock.getsockname() + acceptor = partial(self.accept, server) + self.poller.register(sock, selectors.EVENT_READ, acceptor) + + while self.alive: + # notify the arbiter we are alive + self.notify() + + # can we accept more connections? + if self.nr_conns < self.worker_connections: + # wait for an event + events = self.poller.select(1.0) + for key, _ in events: + callback = key.data + callback(key.fileobj) + + # check (but do not wait) for finished requests + result = futures.wait(self.futures, timeout=0, + return_when=futures.FIRST_COMPLETED) + else: + # wait for a request to finish + result = futures.wait(self.futures, timeout=1.0, + return_when=futures.FIRST_COMPLETED) + + # clean up finished requests + for fut in result.done: + self.futures.remove(fut) + + if not self.is_parent_alive(): + break + + # handle keepalive timeouts + self.murder_keepalived() + + self.tpool.shutdown(False) + self.poller.close() + + for s in self.sockets: + s.close() + + futures.wait(self.futures, timeout=self.cfg.graceful_timeout) + + def finish_request(self, fs): + if fs.cancelled(): + self.nr_conns -= 1 + fs.conn.close() + return + + try: + (keepalive, conn) = fs.result() + # if the connection should be kept alived add it + # to the eventloop and record it + if keepalive and self.alive: + # flag the socket as non blocked + conn.sock.setblocking(False) + + # register the connection + conn.set_timeout() + with self._lock: + self._keep.append(conn) + + # add the socket to the event loop + self.poller.register(conn.sock, selectors.EVENT_READ, + partial(self.on_client_socket_readable, conn)) + else: + self.nr_conns -= 1 + conn.close() + except Exception: + # an exception happened, make sure to close the + # socket. + self.nr_conns -= 1 + fs.conn.close() + + def handle(self, conn): + keepalive = False + req = None + try: + req = next(conn.parser) + if not req: + return (False, conn) + + # handle the request + keepalive = self.handle_request(req, conn) + if keepalive: + return (keepalive, conn) + except http.errors.NoMoreData as e: + self.log.debug("Ignored premature client disconnection. %s", e) + + except StopIteration as e: + self.log.debug("Closing connection. %s", e) + except ssl.SSLError as e: + if e.args[0] == ssl.SSL_ERROR_EOF: + self.log.debug("ssl connection closed") + conn.sock.close() + else: + self.log.debug("Error processing SSL request.") + self.handle_error(req, conn.sock, conn.client, e) + + except OSError as e: + if e.errno not in (errno.EPIPE, errno.ECONNRESET, errno.ENOTCONN): + self.log.exception("Socket error processing request.") + else: + if e.errno == errno.ECONNRESET: + self.log.debug("Ignoring connection reset") + elif e.errno == errno.ENOTCONN: + self.log.debug("Ignoring socket not connected") + else: + self.log.debug("Ignoring connection epipe") + except Exception as e: + self.handle_error(req, conn.sock, conn.client, e) + + return (False, conn) + + def handle_request(self, req, conn): + environ = {} + resp = None + try: + self.cfg.pre_request(self, req) + request_start = datetime.now() + resp, environ = wsgi.create(req, conn.sock, conn.client, + conn.server, self.cfg) + environ["wsgi.multithread"] = True + self.nr += 1 + if self.nr >= self.max_requests: + if self.alive: + self.log.info("Autorestarting worker after current request.") + self.alive = False + resp.force_close() + + if not self.alive or not self.cfg.keepalive: + resp.force_close() + elif len(self._keep) >= self.max_keepalived: + resp.force_close() + + respiter = self.wsgi(environ, resp.start_response) + try: + if isinstance(respiter, environ['wsgi.file_wrapper']): + resp.write_file(respiter) + else: + for item in respiter: + resp.write(item) + + resp.close() + finally: + request_time = datetime.now() - request_start + self.log.access(resp, req, environ, request_time) + if hasattr(respiter, "close"): + respiter.close() + + if resp.should_close(): + self.log.debug("Closing connection.") + return False + except OSError: + # pass to next try-except level + util.reraise(*sys.exc_info()) + except Exception: + if resp and resp.headers_sent: + # If the requests have already been sent, we should close the + # connection to indicate the error. + self.log.exception("Error handling request") + try: + conn.sock.shutdown(socket.SHUT_RDWR) + conn.sock.close() + except OSError: + pass + raise StopIteration() + raise + finally: + try: + self.cfg.post_request(self, req, environ, resp) + except Exception: + self.log.exception("Exception in post_request hook") + + return True diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gtornado.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gtornado.py new file mode 100644 index 00000000..544af7d0 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/gtornado.py @@ -0,0 +1,166 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import os +import sys + +try: + import tornado +except ImportError: + raise RuntimeError("You need tornado installed to use this worker.") +import tornado.web +import tornado.httpserver +from tornado.ioloop import IOLoop, PeriodicCallback +from tornado.wsgi import WSGIContainer +from gunicorn.workers.base import Worker +from gunicorn import __version__ as gversion +from gunicorn.sock import ssl_context + + +# Tornado 5.0 updated its IOLoop, and the `io_loop` arguments to many +# Tornado functions have been removed in Tornado 5.0. Also, they no +# longer store PeriodCallbacks in ioloop._callbacks. Instead we store +# them on our side, and use stop() on them when stopping the worker. +# See https://www.tornadoweb.org/en/stable/releases/v5.0.0.html#backwards-compatibility-notes +# for more details. +TORNADO5 = tornado.version_info >= (5, 0, 0) + + +class TornadoWorker(Worker): + + @classmethod + def setup(cls): + web = sys.modules.pop("tornado.web") + old_clear = web.RequestHandler.clear + + def clear(self): + old_clear(self) + if "Gunicorn" not in self._headers["Server"]: + self._headers["Server"] += " (Gunicorn/%s)" % gversion + web.RequestHandler.clear = clear + sys.modules["tornado.web"] = web + + def handle_exit(self, sig, frame): + if self.alive: + super().handle_exit(sig, frame) + + def handle_request(self): + self.nr += 1 + if self.alive and self.nr >= self.max_requests: + self.log.info("Autorestarting worker after current request.") + self.alive = False + + def watchdog(self): + if self.alive: + self.notify() + + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s", self) + self.alive = False + + def heartbeat(self): + if not self.alive: + if self.server_alive: + if hasattr(self, 'server'): + try: + self.server.stop() + except Exception: + pass + self.server_alive = False + else: + if TORNADO5: + for callback in self.callbacks: + callback.stop() + self.ioloop.stop() + else: + if not self.ioloop._callbacks: + self.ioloop.stop() + + def init_process(self): + # IOLoop cannot survive a fork or be shared across processes + # in any way. When multiple processes are being used, each process + # should create its own IOLoop. We should clear current IOLoop + # if exists before os.fork. + IOLoop.clear_current() + super().init_process() + + def run(self): + self.ioloop = IOLoop.instance() + self.alive = True + self.server_alive = False + + if TORNADO5: + self.callbacks = [] + self.callbacks.append(PeriodicCallback(self.watchdog, 1000)) + self.callbacks.append(PeriodicCallback(self.heartbeat, 1000)) + for callback in self.callbacks: + callback.start() + else: + PeriodicCallback(self.watchdog, 1000, io_loop=self.ioloop).start() + PeriodicCallback(self.heartbeat, 1000, io_loop=self.ioloop).start() + + # Assume the app is a WSGI callable if its not an + # instance of tornado.web.Application or is an + # instance of tornado.wsgi.WSGIApplication + app = self.wsgi + + if tornado.version_info[0] < 6: + if not isinstance(app, tornado.web.Application) or \ + isinstance(app, tornado.wsgi.WSGIApplication): + app = WSGIContainer(app) + elif not isinstance(app, WSGIContainer) and \ + not isinstance(app, tornado.web.Application): + app = WSGIContainer(app) + + # Monkey-patching HTTPConnection.finish to count the + # number of requests being handled by Tornado. This + # will help gunicorn shutdown the worker if max_requests + # is exceeded. + httpserver = sys.modules["tornado.httpserver"] + if hasattr(httpserver, 'HTTPConnection'): + old_connection_finish = httpserver.HTTPConnection.finish + + def finish(other): + self.handle_request() + old_connection_finish(other) + httpserver.HTTPConnection.finish = finish + sys.modules["tornado.httpserver"] = httpserver + + server_class = tornado.httpserver.HTTPServer + else: + + class _HTTPServer(tornado.httpserver.HTTPServer): + + def on_close(instance, server_conn): + self.handle_request() + super().on_close(server_conn) + + server_class = _HTTPServer + + if self.cfg.is_ssl: + if TORNADO5: + server = server_class(app, ssl_options=ssl_context(self.cfg)) + else: + server = server_class(app, io_loop=self.ioloop, + ssl_options=ssl_context(self.cfg)) + else: + if TORNADO5: + server = server_class(app) + else: + server = server_class(app, io_loop=self.ioloop) + + self.server = server + self.server_alive = True + + for s in self.sockets: + s.setblocking(0) + if hasattr(server, "add_socket"): # tornado > 2.0 + server.add_socket(s) + elif hasattr(server, "_sockets"): # tornado 2.0 + server._sockets[s.fileno()] = s + + server.no_keep_alive = self.cfg.keepalive <= 0 + server.start(num_processes=1) + + self.ioloop.start() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/sync.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/sync.py new file mode 100644 index 00000000..4c029f91 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/sync.py @@ -0,0 +1,209 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. +# + +from datetime import datetime +import errno +import os +import select +import socket +import ssl +import sys + +from gunicorn import http +from gunicorn.http import wsgi +from gunicorn import sock +from gunicorn import util +from gunicorn.workers import base + + +class StopWaiting(Exception): + """ exception raised to stop waiting for a connection """ + + +class SyncWorker(base.Worker): + + def accept(self, listener): + client, addr = listener.accept() + client.setblocking(1) + util.close_on_exec(client) + self.handle(listener, client, addr) + + def wait(self, timeout): + try: + self.notify() + ret = select.select(self.wait_fds, [], [], timeout) + if ret[0]: + if self.PIPE[0] in ret[0]: + os.read(self.PIPE[0], 1) + return ret[0] + + except OSError as e: + if e.args[0] == errno.EINTR: + return self.sockets + if e.args[0] == errno.EBADF: + if self.nr < 0: + return self.sockets + else: + raise StopWaiting + raise + + def is_parent_alive(self): + # If our parent changed then we shut down. + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s", self) + return False + return True + + def run_for_one(self, timeout): + listener = self.sockets[0] + while self.alive: + self.notify() + + # Accept a connection. If we get an error telling us + # that no connection is waiting we fall down to the + # select which is where we'll wait for a bit for new + # workers to come give us some love. + try: + self.accept(listener) + # Keep processing clients until no one is waiting. This + # prevents the need to select() for every client that we + # process. + continue + + except OSError as e: + if e.errno not in (errno.EAGAIN, errno.ECONNABORTED, + errno.EWOULDBLOCK): + raise + + if not self.is_parent_alive(): + return + + try: + self.wait(timeout) + except StopWaiting: + return + + def run_for_multiple(self, timeout): + while self.alive: + self.notify() + + try: + ready = self.wait(timeout) + except StopWaiting: + return + + if ready is not None: + for listener in ready: + if listener == self.PIPE[0]: + continue + + try: + self.accept(listener) + except OSError as e: + if e.errno not in (errno.EAGAIN, errno.ECONNABORTED, + errno.EWOULDBLOCK): + raise + + if not self.is_parent_alive(): + return + + def run(self): + # if no timeout is given the worker will never wait and will + # use the CPU for nothing. This minimal timeout prevent it. + timeout = self.timeout or 0.5 + + # self.socket appears to lose its blocking status after + # we fork in the arbiter. Reset it here. + for s in self.sockets: + s.setblocking(0) + + if len(self.sockets) > 1: + self.run_for_multiple(timeout) + else: + self.run_for_one(timeout) + + def handle(self, listener, client, addr): + req = None + try: + if self.cfg.is_ssl: + client = sock.ssl_wrap_socket(client, self.cfg) + parser = http.RequestParser(self.cfg, client, addr) + req = next(parser) + self.handle_request(listener, req, client, addr) + except http.errors.NoMoreData as e: + self.log.debug("Ignored premature client disconnection. %s", e) + except StopIteration as e: + self.log.debug("Closing connection. %s", e) + except ssl.SSLError as e: + if e.args[0] == ssl.SSL_ERROR_EOF: + self.log.debug("ssl connection closed") + client.close() + else: + self.log.debug("Error processing SSL request.") + self.handle_error(req, client, addr, e) + except OSError as e: + if e.errno not in (errno.EPIPE, errno.ECONNRESET, errno.ENOTCONN): + self.log.exception("Socket error processing request.") + else: + if e.errno == errno.ECONNRESET: + self.log.debug("Ignoring connection reset") + elif e.errno == errno.ENOTCONN: + self.log.debug("Ignoring socket not connected") + else: + self.log.debug("Ignoring EPIPE") + except BaseException as e: + self.handle_error(req, client, addr, e) + finally: + util.close(client) + + def handle_request(self, listener, req, client, addr): + environ = {} + resp = None + try: + self.cfg.pre_request(self, req) + request_start = datetime.now() + resp, environ = wsgi.create(req, client, addr, + listener.getsockname(), self.cfg) + # Force the connection closed until someone shows + # a buffering proxy that supports Keep-Alive to + # the backend. + resp.force_close() + self.nr += 1 + if self.nr >= self.max_requests: + self.log.info("Autorestarting worker after current request.") + self.alive = False + respiter = self.wsgi(environ, resp.start_response) + try: + if isinstance(respiter, environ['wsgi.file_wrapper']): + resp.write_file(respiter) + else: + for item in respiter: + resp.write(item) + resp.close() + finally: + request_time = datetime.now() - request_start + self.log.access(resp, req, environ, request_time) + if hasattr(respiter, "close"): + respiter.close() + except OSError: + # pass to next try-except level + util.reraise(*sys.exc_info()) + except Exception: + if resp and resp.headers_sent: + # If the requests have already been sent, we should close the + # connection to indicate the error. + self.log.exception("Error handling request") + try: + client.shutdown(socket.SHUT_RDWR) + client.close() + except OSError: + pass + raise StopIteration() + raise + finally: + try: + self.cfg.post_request(self, req, environ, resp) + except Exception: + self.log.exception("Exception in post_request hook") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/workertmp.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/workertmp.py new file mode 100644 index 00000000..8ef00a56 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/gunicorn/workers/workertmp.py @@ -0,0 +1,53 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +import os +import time +import platform +import tempfile + +from gunicorn import util + +PLATFORM = platform.system() +IS_CYGWIN = PLATFORM.startswith('CYGWIN') + + +class WorkerTmp: + + def __init__(self, cfg): + old_umask = os.umask(cfg.umask) + fdir = cfg.worker_tmp_dir + if fdir and not os.path.isdir(fdir): + raise RuntimeError("%s doesn't exist. Can't create workertmp." % fdir) + fd, name = tempfile.mkstemp(prefix="wgunicorn-", dir=fdir) + os.umask(old_umask) + + # change the owner and group of the file if the worker will run as + # a different user or group, so that the worker can modify the file + if cfg.uid != os.geteuid() or cfg.gid != os.getegid(): + util.chown(name, cfg.uid, cfg.gid) + + # unlink the file so we don't leak temporary files + try: + if not IS_CYGWIN: + util.unlink(name) + # In Python 3.8, open() emits RuntimeWarning if buffering=1 for binary mode. + # Because we never write to this file, pass 0 to switch buffering off. + self._tmp = os.fdopen(fd, 'w+b', 0) + except Exception: + os.close(fd) + raise + + def notify(self): + new_time = time.monotonic() + os.utime(self._tmp.fileno(), (new_time, new_time)) + + def last_update(self): + return os.fstat(self._tmp.fileno()).st_mtime + + def fileno(self): + return self._tmp.fileno() + + def close(self): + return self._tmp.close() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt new file mode 100644 index 00000000..7b190ca6 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2011 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA new file mode 100644 index 00000000..ddf54648 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: itsdangerous +Version: 2.2.0 +Summary: Safely pass data to untrusted environments and back. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/itsdangerous/ + +# ItsDangerous + +... so better sign this + +Various helpers to pass data to untrusted environments and to get it +back safe and sound. Data is cryptographically signed to ensure that a +token has not been tampered with. + +It's possible to customize how data is serialized. Data is compressed as +needed. A timestamp can be added and verified automatically while +loading a token. + + +## A Simple Example + +Here's how you could generate a token for transmitting a user's id and +name between web requests. + +```python +from itsdangerous import URLSafeSerializer +auth_s = URLSafeSerializer("secret key", "auth") +token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) + +print(token) +# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg + +data = auth_s.loads(token) +print(data["name"]) +# itsdangerous +``` + + +## Donate + +The Pallets organization develops and supports ItsDangerous and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD new file mode 100644 index 00000000..5f1a9de9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD @@ -0,0 +1,23 @@ +itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 +itsdangerous-2.2.0.dist-info/RECORD,, +itsdangerous-2.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 +itsdangerous/__pycache__/__init__.cpython-312.pyc,, +itsdangerous/__pycache__/_json.cpython-312.pyc,, +itsdangerous/__pycache__/encoding.cpython-312.pyc,, +itsdangerous/__pycache__/exc.cpython-312.pyc,, +itsdangerous/__pycache__/serializer.cpython-312.pyc,, +itsdangerous/__pycache__/signer.cpython-312.pyc,, +itsdangerous/__pycache__/timed.cpython-312.pyc,, +itsdangerous/__pycache__/url_safe.cpython-312.pyc,, +itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 +itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 +itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 +itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 +itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 +itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL new file mode 100644 index 00000000..3b5e64b5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__init__.py new file mode 100644 index 00000000..ea55256e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__init__.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import typing as t + +from .encoding import base64_decode as base64_decode +from .encoding import base64_encode as base64_encode +from .encoding import want_bytes as want_bytes +from .exc import BadData as BadData +from .exc import BadHeader as BadHeader +from .exc import BadPayload as BadPayload +from .exc import BadSignature as BadSignature +from .exc import BadTimeSignature as BadTimeSignature +from .exc import SignatureExpired as SignatureExpired +from .serializer import Serializer as Serializer +from .signer import HMACAlgorithm as HMACAlgorithm +from .signer import NoneAlgorithm as NoneAlgorithm +from .signer import Signer as Signer +from .timed import TimedSerializer as TimedSerializer +from .timed import TimestampSigner as TimestampSigner +from .url_safe import URLSafeSerializer as URLSafeSerializer +from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " ItsDangerous 2.3. Use feature detection or" + " 'importlib.metadata.version(\"itsdangerous\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("itsdangerous") + + raise AttributeError(name) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b828b341e804171a23d09fdfaddfbb16cf723ec8 GIT binary patch literal 1634 zcmZXU&u<$=6vt=%W4&H`ZO3t(q(to|6w*D^OOt|BQ6ZV8&^P~TL_&xIoH%f3uiQZ8KjG5SL#wSURVo}Jafpmn=fBg)_;Nt$H*OptZ5pruI`Sanp% zDsaxpNzVCNkazNuHDKM*CFg+)PC>E`Ty%<(3&4hBNG<}GoRVb2F9#K;BDv&`1y!di zxePq+j7zQn*PNQV2-Lv#S`vvUn0_AyBjYOvBXf&fwHZg z@u=M{jCyBG)W?I2)(|&_&kxX0{a&$ht4YCicPWcuk6o9Err-Z{eT$m&Bl5h7IcMHR zms8V=O+q`2wlJr}#33>FJl{7rsL5y$?Skfo<}#0$aM-3S>c-|mW3gf0kEyvyX}Vfl9%iM|E{kotgTr`h+Y1Ty?d9e56?>(*bi@9(>+J^^Dq;364R>v* z-R|`GRunEaZYtLwnwY7UDpde?z)XmPwZP877Q|jeR~hSJS9?C1M?kv zkt_Uo_*ZV`r8fIgn|!5Jel~tGj#DY)bLCV;#+4V7Q^y6Aub(0{uOF9CW%_w}_Gx+c zdD(hewtj0oE8lve-TGUfdQ^L+Uw)Fgd;(#Sm0@#mOVTlCiOMJ()o?${8_lq1%_O?( zZg$1#g>=M1Br5N9V678{Cz|{>fWt(qGtt>BCqvN(EhgHT<%JP{VEZEsu0G7pmmw=#&C97O=uIsh;{lMvG)aE1@lI`9Ymz- z(@)qUxZ=3PcfcH{6-DWzx!0)r54zbGSEG;K?W6fVvij(HAAKmV5Bg|9URQ_8?LPYK LR4pl2LZg-uTO}Kc4 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 OFz){=g7GuTsDA-vabDH{ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9d6427bd49d95aa0b03264011d4eff126b1e251 GIT binary patch literal 3948 zcmbVPTW=f36`mz`$)!YH?AVdr__A)QsEi{rcH9;ag1Si^v~Cfhs9h8wimpc7k+jKj zmzi10Ccy_65KtLtPyC4!4~WuBQm zGdq`azVDplzs=3fFg!nf>x=E*lo|V+UWSjAbd1Blp!1M<%rgSkH0p*y{alc%=h5Z^ zvuV~%gXP$dm}l-W&l1+-eDZC*ptS{Pi=vQei&|?#TN1@gYisQcw6ns_v?Z-ALpwJ% zcSdXHp-SB(BF55p+tu^)wM9q+csV-fpJ(MZmg$n>Db;Tw4WEv_k8 z-SAjF=NY)3xzDx?FSl2&o1W$6_sqJr&+Z!a!Yx)Q^o#Fu?*@-~_YXhkz7n3}Z#kRX zbFdM2qAiDq9Y;kncJ6THh_Dg0!&pe+Rh`>AzH;y{-Vyjhi5UmaRwNxB1dh1d5G{Rd zjPuyJ8LJyS+!iuwE5{RCekfFRMt@SRI=ezDT#+2^qlX%~v1`&T@iPvu zqVq@NA&axY`?((b7_ROakBvlWpxaM{_n!Z{_6vn$*2ITAR68H|p~r*T&6~I1uf6}yjVrZ} z+J3jm6>L-672$3z@HcC%PP`L^Z&j~cttmeit1aI65L>C5A1iNYjT%f#+|= zJN4XR(uS&H=zvHE2gG3;c zSUZb}io`V54(8cwtAw`1kQzB=vJDwr@AbSKSKmRb=sD|AC>|B$DH=IV;$;$q;l!_J zsHgWLyrph@g_I;{vRZ_I8~9U+`2jLR*JW)6ydxv4^!+5cX{BCMM5B;y{Y4dj$VkKYx-?%W8B^w)g-p1@WZhg zqrS!j-C`=XnL|wUa*xw^hUf;QyciX;lqy_;r0^=%G%{YrJ_$T1LjoQX_&7UlkPIUg z%vKj5fRRC&mFClk^yigN?bi=Zv2!c?=0EH+X+T(CuN0j@n$qNTX>e=k&(c%6y@-vC-sr zU4;FOjU;Dk?_#TGL^mQ zf329A#D7vwjaM^zEBc?* z@%gAqBP4!>->Bd$SoYDPWnF*9AQH6Fq)M6U-K{niizsZ#Q2j#OX~7kJBbIcTektQs zQqAgGh!Ry2(>0&;t_1Q?#D8wToz&6amsB-SB2&MFILI4@@frK(=j`NX?EIimHqPz) z1BPaBVb)lE@Vx;;GdOqJSb5MJFf@ZV^M?J&(#n9L9h8@h>krBUhGuYW9{r^+85+Iu Fe*k0Xe5wEd literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffabcd22a10993e8001431c719d347aa9584cd2e GIT binary patch literal 15429 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 AU;qFB literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e7b18745fb8e766126103d65cdeabeec45e2042 GIT binary patch literal 11294 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 b)4b%*0ELI3t-hMJjiO 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 MX#8`68P@mz0P#j=Qvd(} literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f38182c190108fee3e5d17f446ae18a873d3a1e0 GIT binary patch literal 3538 zcmbtWU2Ggz6~41Gv;Tiyd)IanLZowaM{gibjf-M!Fcp zY%#*8RP7~o*|1a%#7X6)an(_$2-Q_XuM!Hp@Dr=VIlV-*4y)*$+?!hm6*j*M>mP&T z2`UI0D)`Pr016_J3bN)SeoZ_Ha!u0Yw}lYe`KJZzXjahtSK@_$7UFc^O0)pnOF|(u zg|cBcbN)Nuo>FH?=NJ?ECEcvP4-cYY-NZ|}GmlkF$y~)yDYmyi2gns;HXShA%Ld@eILbLoIseRxx~9j+?2bcLw8SIMPKorIA^+VmM0Y zqgbfJon_J23JS{#8U7Op37dOi^)ms$AgstWVS&kZ49$15#ifCo0AN77(2Af*D{=@q ztprA>CbYFy{56?oKnC#h#sY_Ad*wZA{*JyAYs;<%Yv?C?z?y$fsEI!pe&yFuP5OoK zQ(+2?Ag7f{2<=0(cO~Go01a6q*8;!v-)wzhE$~C1hE@VU2rLOp=#uz7v?P4)?!bTA zoefStzsbCiqwEalswYlc6+^>-HQWlU2PPiavWFaqVNtEv1Y5Hh0!uCxNtpo?!V_{V`+z(v96@+7@V~z;ZlufAtYo=mJLFz9hEvZOLFRmQ@WvVv|mYs zY%MX{Zn$IImF-HIP&dkeuCy(MT*)TJtQ%-CC?pDOR_UDW`WKhjlV&(;!M03SAZ|!e ziiT?2iej^%GtjVc`EfCS9um;blSS3E=NEKSQ;q!Dv*#xA6Jz6t^RHC&YDu*LJ^5FO z`Dz}HmoG0n^Okuuclb!&)*W&P>eiw`a#kD9ZZidqh=gscGtuABdNbchVDd$R<%DzMjDx+Rdsddjm7$z#^6x>g{I^W zrSJCQwf>FXY<>J;97QutpFcKuw}1Eb*RH*`=4|vId_&rbqh$K((w)S}+W2~6^v1Cd z5~H_{-${(F2S*=m4Ws1X$4CN0sXdM4L}M6l$zpH3=|_F(Whe??Pi_A1L;xKyhFY6nh4lVr=lSor6z!Co93N z=p&(1aq;$v_^FWi`;ZLuHuhmBVi^p$6*hkZ1jD|=xO`mo1OA{kbfMV?l|gh^z2IYk zW!8>S+pZ8RQU~=lsg3Y1-nORZt3p*+1jJIQCaw515#ADM8}70w*F-97QcbRc5NebR zwO*cl-oqj70cO@uS!CU)RwP)E6%AriRxh#v%C25lv}P9Q5Tjzct+e%s z=7ziIfCp}k4uhi2w)4csmnjCC?uF^!W?uJcz6^@?_hEv}yPN3qa^>_!Vt-v~3=Gv{ zchiH{FJ8O2c5EZPzaIW560cWZ|N7g-wS8~tH=cU4^g-lcqj#u2-q?fd6Cb69*QAZq z)AhjLA_I-guGI_I%=(%8iA+7d32%U#knVzqE6*%D#HPD}ek?n=F>{#%xf?-yBsK+SQ)ZkhUw9d z&_kan2b*DZ_^azuW_{q$hIFzSMf>(Y41Ga9ala?il;H`;Ndm+e6-4Q$noI_JdIy>j zMnzFL@ktD*e>^9|<^G2VCYo)(?THqqbpZ;SNf37$7}mZ(_a(YL|5AOb?_IFyqKyq5 zx`a_)9Y?2gQ`;TKG@hwAnB|BKmxG2`owA`vfyRR0_Fe-L1__gchNx!^L@(LZb(KPl=mRjqr4=}R!Zi##7;#yHlVz6r!8!^ai$F$;~S!^HoUAKNY5j&`#8 zhtG264yDiYD0c(I=>PO6H^W^2KYElt%lvhmO+3#qqrTFfUStHT6rParvuTF2*$My? za7LkO15TagGGu`(I9`pD6?P4Cu(?6rUV@Z20KDG0A~YWS{^#(g?1HAOA#-JiHSLrY zT~~xAl7q|(DL>Pb=X@MI>EZor^c3u1h~Qvsih>~ALwi3&slTGg-_h_rG{S$o@1gy` zhu@a}xX`~^xFNo&Y#|`Gs2~Z!^?}^2@NbX)I t.Any: + return _json.loads(payload) + + @staticmethod + def dumps(obj: t.Any, **kwargs: t.Any) -> str: + kwargs.setdefault("ensure_ascii", False) + kwargs.setdefault("separators", (",", ":")) + return _json.dumps(obj, **kwargs) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/encoding.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/encoding.py new file mode 100644 index 00000000..f5ca80f9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/encoding.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +import base64 +import string +import struct +import typing as t + +from .exc import BadData + + +def want_bytes( + s: str | bytes, encoding: str = "utf-8", errors: str = "strict" +) -> bytes: + if isinstance(s, str): + s = s.encode(encoding, errors) + + return s + + +def base64_encode(string: str | bytes) -> bytes: + """Base64 encode a string of bytes or text. The resulting bytes are + safe to use in URLs. + """ + string = want_bytes(string) + return base64.urlsafe_b64encode(string).rstrip(b"=") + + +def base64_decode(string: str | bytes) -> bytes: + """Base64 decode a URL-safe string of bytes or text. The result is + bytes. + """ + string = want_bytes(string, encoding="ascii", errors="ignore") + string += b"=" * (-len(string) % 4) + + try: + return base64.urlsafe_b64decode(string) + except (TypeError, ValueError) as e: + raise BadData("Invalid base64-encoded data") from e + + +# The alphabet used by base64.urlsafe_* +_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") + +_int64_struct = struct.Struct(">Q") +_int_to_bytes = _int64_struct.pack +_bytes_to_int = t.cast("t.Callable[[bytes], tuple[int]]", _int64_struct.unpack) + + +def int_to_bytes(num: int) -> bytes: + return _int_to_bytes(num).lstrip(b"\x00") + + +def bytes_to_int(bytestr: bytes) -> int: + return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/exc.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/exc.py new file mode 100644 index 00000000..a75adcd5 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/exc.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +import typing as t +from datetime import datetime + + +class BadData(Exception): + """Raised if bad data of any sort was encountered. This is the base + for all exceptions that ItsDangerous defines. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str): + super().__init__(message) + self.message = message + + def __str__(self) -> str: + return self.message + + +class BadSignature(BadData): + """Raised if a signature does not match.""" + + def __init__(self, message: str, payload: t.Any | None = None): + super().__init__(message) + + #: The payload that failed the signature test. In some + #: situations you might still want to inspect this, even if + #: you know it was tampered with. + #: + #: .. versionadded:: 0.14 + self.payload: t.Any | None = payload + + +class BadTimeSignature(BadSignature): + """Raised if a time-based signature is invalid. This is a subclass + of :class:`BadSignature`. + """ + + def __init__( + self, + message: str, + payload: t.Any | None = None, + date_signed: datetime | None = None, + ): + super().__init__(message, payload) + + #: If the signature expired this exposes the date of when the + #: signature was created. This can be helpful in order to + #: tell the user how long a link has been gone stale. + #: + #: .. versionchanged:: 2.0 + #: The datetime value is timezone-aware rather than naive. + #: + #: .. versionadded:: 0.14 + self.date_signed = date_signed + + +class SignatureExpired(BadTimeSignature): + """Raised if a signature timestamp is older than ``max_age``. This + is a subclass of :exc:`BadTimeSignature`. + """ + + +class BadHeader(BadSignature): + """Raised if a signed header is invalid in some form. This only + happens for serializers that have a header that goes with the + signature. + + .. versionadded:: 0.24 + """ + + def __init__( + self, + message: str, + payload: t.Any | None = None, + header: t.Any | None = None, + original_error: Exception | None = None, + ): + super().__init__(message, payload) + + #: If the header is actually available but just malformed it + #: might be stored here. + self.header: t.Any | None = header + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: Exception | None = original_error + + +class BadPayload(BadData): + """Raised if a payload is invalid. This could happen if the payload + is loaded despite an invalid signature, or if there is a mismatch + between the serializer and deserializer. The original exception + that occurred during loading is stored on as :attr:`original_error`. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str, original_error: Exception | None = None): + super().__init__(message) + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: Exception | None = original_error diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/py.typed b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/serializer.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/serializer.py new file mode 100644 index 00000000..5ddf3871 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/serializer.py @@ -0,0 +1,406 @@ +from __future__ import annotations + +import collections.abc as cabc +import json +import typing as t + +from .encoding import want_bytes +from .exc import BadPayload +from .exc import BadSignature +from .signer import _make_keys_list +from .signer import Signer + +if t.TYPE_CHECKING: + import typing_extensions as te + + # This should be either be str or bytes. To avoid having to specify the + # bound type, it falls back to a union if structural matching fails. + _TSerialized = te.TypeVar( + "_TSerialized", bound=t.Union[str, bytes], default=t.Union[str, bytes] + ) +else: + # Still available at runtime on Python < 3.13, but without the default. + _TSerialized = t.TypeVar("_TSerialized", bound=t.Union[str, bytes]) + + +class _PDataSerializer(t.Protocol[_TSerialized]): + def loads(self, payload: _TSerialized, /) -> t.Any: ... + # A signature with additional arguments is not handled correctly by type + # checkers right now, so an overload is used below for serializers that + # don't match this strict protocol. + def dumps(self, obj: t.Any, /) -> _TSerialized: ... + + +# Use TypeIs once it's available in typing_extensions or 3.13. +def is_text_serializer( + serializer: _PDataSerializer[t.Any], +) -> te.TypeGuard[_PDataSerializer[str]]: + """Checks whether a serializer generates text or binary.""" + return isinstance(serializer.dumps({}), str) + + +class Serializer(t.Generic[_TSerialized]): + """A serializer wraps a :class:`~itsdangerous.signer.Signer` to + enable serializing and securely signing data other than bytes. It + can unsign to verify that the data hasn't been changed. + + The serializer provides :meth:`dumps` and :meth:`loads`, similar to + :mod:`json`, and by default uses :mod:`json` internally to serialize + the data to bytes. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param serializer: An object that provides ``dumps`` and ``loads`` + methods for serializing data to a string. Defaults to + :attr:`default_serializer`, which defaults to :mod:`json`. + :param serializer_kwargs: Keyword arguments to pass when calling + ``serializer.dumps``. + :param signer: A ``Signer`` class to instantiate when signing data. + Defaults to :attr:`default_signer`, which defaults to + :class:`~itsdangerous.signer.Signer`. + :param signer_kwargs: Keyword arguments to pass when instantiating + the ``Signer`` class. + :param fallback_signers: List of signer parameters to try when + unsigning with the default signer fails. Each item can be a dict + of ``signer_kwargs``, a ``Signer`` class, or a tuple of + ``(signer, signer_kwargs)``. Defaults to + :attr:`default_fallback_signers`. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 2.0 + Removed the default SHA-512 fallback signer from + ``default_fallback_signers``. + + .. versionchanged:: 1.1 + Added support for ``fallback_signers`` and configured a default + SHA-512 fallback. This fallback is for users who used the yanked + 1.0.0 release which defaulted to SHA-512. + + .. versionchanged:: 0.14 + The ``signer`` and ``signer_kwargs`` parameters were added to + the constructor. + """ + + #: The default serialization module to use to serialize data to a + #: string internally. The default is :mod:`json`, but can be changed + #: to any object that provides ``dumps`` and ``loads`` methods. + default_serializer: _PDataSerializer[t.Any] = json + + #: The default ``Signer`` class to instantiate when signing data. + #: The default is :class:`itsdangerous.signer.Signer`. + default_signer: type[Signer] = Signer + + #: The default fallback signers to try when unsigning fails. + default_fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = [] + + # Serializer[str] if no data serializer is provided, or if it returns str. + @t.overload + def __init__( + self: Serializer[str], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: None | _PDataSerializer[str] = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer positional argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer keyword argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a positional argument. If the strict signature of + # _PDataSerializer doesn't match, fall back to a union, requiring the user + # to specify the type. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a keyword argument. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: t.Any | None = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: list[bytes] = _make_keys_list(secret_key) + + if salt is not None: + salt = want_bytes(salt) + # if salt is None then the signer's default is used + + self.salt = salt + + if serializer is None: + serializer = self.default_serializer + + self.serializer: _PDataSerializer[_TSerialized] = serializer + self.is_text_serializer: bool = is_text_serializer(serializer) + + if signer is None: + signer = self.default_signer + + self.signer: type[Signer] = signer + self.signer_kwargs: dict[str, t.Any] = signer_kwargs or {} + + if fallback_signers is None: + fallback_signers = list(self.default_fallback_signers) + + self.fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = fallback_signers + self.serializer_kwargs: dict[str, t.Any] = serializer_kwargs or {} + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def load_payload( + self, payload: bytes, serializer: _PDataSerializer[t.Any] | None = None + ) -> t.Any: + """Loads the encoded object. This function raises + :class:`.BadPayload` if the payload is not valid. The + ``serializer`` parameter can be used to override the serializer + stored on the class. The encoded ``payload`` should always be + bytes. + """ + if serializer is None: + use_serializer = self.serializer + is_text = self.is_text_serializer + else: + use_serializer = serializer + is_text = is_text_serializer(serializer) + + try: + if is_text: + return use_serializer.loads(payload.decode("utf-8")) # type: ignore[arg-type] + + return use_serializer.loads(payload) # type: ignore[arg-type] + except Exception as e: + raise BadPayload( + "Could not load the payload because an exception" + " occurred on unserializing the data.", + original_error=e, + ) from e + + def dump_payload(self, obj: t.Any) -> bytes: + """Dumps the encoded object. The return value is always bytes. + If the internal serializer returns text, the value will be + encoded as UTF-8. + """ + return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) + + def make_signer(self, salt: str | bytes | None = None) -> Signer: + """Creates a new instance of the signer to be used. The default + implementation uses the :class:`.Signer` base class. + """ + if salt is None: + salt = self.salt + + return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) + + def iter_unsigners(self, salt: str | bytes | None = None) -> cabc.Iterator[Signer]: + """Iterates over all signers to be tried for unsigning. Starts + with the configured signer, then constructs each signer + specified in ``fallback_signers``. + """ + if salt is None: + salt = self.salt + + yield self.make_signer(salt) + + for fallback in self.fallback_signers: + if isinstance(fallback, dict): + kwargs = fallback + fallback = self.signer + elif isinstance(fallback, tuple): + fallback, kwargs = fallback + else: + kwargs = self.signer_kwargs + + for secret_key in self.secret_keys: + yield fallback(secret_key, salt=salt, **kwargs) + + def dumps(self, obj: t.Any, salt: str | bytes | None = None) -> _TSerialized: + """Returns a signed string serialized with the internal + serializer. The return value can be either a byte or unicode + string depending on the format of the internal serializer. + """ + payload = want_bytes(self.dump_payload(obj)) + rv = self.make_signer(salt).sign(payload) + + if self.is_text_serializer: + return rv.decode("utf-8") # type: ignore[return-value] + + return rv # type: ignore[return-value] + + def dump(self, obj: t.Any, f: t.IO[t.Any], salt: str | bytes | None = None) -> None: + """Like :meth:`dumps` but dumps into a file. The file handle has + to be compatible with what the internal serializer expects. + """ + f.write(self.dumps(obj, salt)) + + def loads( + self, s: str | bytes, salt: str | bytes | None = None, **kwargs: t.Any + ) -> t.Any: + """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the + signature validation fails. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + return self.load_payload(signer.unsign(s)) + except BadSignature as err: + last_exception = err + + raise t.cast(BadSignature, last_exception) + + def load(self, f: t.IO[t.Any], salt: str | bytes | None = None) -> t.Any: + """Like :meth:`loads` but loads from a file.""" + return self.loads(f.read(), salt) + + def loads_unsafe( + self, s: str | bytes, salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: + """Like :meth:`loads` but without verifying the signature. This + is potentially very dangerous to use depending on how your + serializer works. The return value is ``(signature_valid, + payload)`` instead of just the payload. The first item will be a + boolean that indicates if the signature is valid. This function + never fails. + + Use it for debugging only and if you know that your serializer + module is not exploitable (for example, do not use it with a + pickle serializer). + + .. versionadded:: 0.15 + """ + return self._loads_unsafe_impl(s, salt) + + def _loads_unsafe_impl( + self, + s: str | bytes, + salt: str | bytes | None, + load_kwargs: dict[str, t.Any] | None = None, + load_payload_kwargs: dict[str, t.Any] | None = None, + ) -> tuple[bool, t.Any]: + """Low level helper function to implement :meth:`loads_unsafe` + in serializer subclasses. + """ + if load_kwargs is None: + load_kwargs = {} + + try: + return True, self.loads(s, salt=salt, **load_kwargs) + except BadSignature as e: + if e.payload is None: + return False, None + + if load_payload_kwargs is None: + load_payload_kwargs = {} + + try: + return ( + False, + self.load_payload(e.payload, **load_payload_kwargs), + ) + except BadPayload: + return False, None + + def load_unsafe( + self, f: t.IO[t.Any], salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: + """Like :meth:`loads_unsafe` but loads from a file. + + .. versionadded:: 0.15 + """ + return self.loads_unsafe(f.read(), salt=salt) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/signer.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/signer.py new file mode 100644 index 00000000..e324dc03 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/signer.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +import collections.abc as cabc +import hashlib +import hmac +import typing as t + +from .encoding import _base64_alphabet +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import want_bytes +from .exc import BadSignature + + +class SigningAlgorithm: + """Subclasses must implement :meth:`get_signature` to provide + signature generation functionality. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + """Returns the signature for the given key and value.""" + raise NotImplementedError() + + def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: + """Verifies the given signature matches the expected + signature. + """ + return hmac.compare_digest(sig, self.get_signature(key, value)) + + +class NoneAlgorithm(SigningAlgorithm): + """Provides an algorithm that does not perform any signing and + returns an empty signature. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + return b"" + + +def _lazy_sha1(string: bytes = b"") -> t.Any: + """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include + SHA-1, in which case the import and use as a default would fail before the + developer can configure something else. + """ + return hashlib.sha1(string) + + +class HMACAlgorithm(SigningAlgorithm): + """Provides signature generation using HMACs.""" + + #: The digest method to use with the MAC algorithm. This defaults to + #: SHA1, but can be changed to any other function in the hashlib + #: module. + default_digest_method: t.Any = staticmethod(_lazy_sha1) + + def __init__(self, digest_method: t.Any = None): + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: t.Any = digest_method + + def get_signature(self, key: bytes, value: bytes) -> bytes: + mac = hmac.new(key, msg=value, digestmod=self.digest_method) + return mac.digest() + + +def _make_keys_list( + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], +) -> list[bytes]: + if isinstance(secret_key, (str, bytes)): + return [want_bytes(secret_key)] + + return [want_bytes(s) for s in secret_key] # pyright: ignore + + +class Signer: + """A signer securely signs bytes, then unsigns them to verify that + the value hasn't been changed. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param sep: Separator between the signature and value. + :param key_derivation: How to derive the signing key from the secret + key and salt. Possible values are ``concat``, ``django-concat``, + or ``hmac``. Defaults to :attr:`default_key_derivation`, which + defaults to ``django-concat``. + :param digest_method: Hash function to use when generating the HMAC + signature. Defaults to :attr:`default_digest_method`, which + defaults to :func:`hashlib.sha1`. Note that the security of the + hash alone doesn't apply when used intermediately in HMAC. + :param algorithm: A :class:`SigningAlgorithm` instance to use + instead of building a default :class:`HMACAlgorithm` with the + ``digest_method``. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 0.18 + ``algorithm`` was added as an argument to the class constructor. + + .. versionchanged:: 0.14 + ``key_derivation`` and ``digest_method`` were added as arguments + to the class constructor. + """ + + #: The default digest method to use for the signer. The default is + #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or + #: compatible object. Note that the security of the hash alone + #: doesn't apply when used intermediately in HMAC. + #: + #: .. versionadded:: 0.14 + default_digest_method: t.Any = staticmethod(_lazy_sha1) + + #: The default scheme to use to derive the signing key from the + #: secret key and salt. The default is ``django-concat``. Possible + #: values are ``concat``, ``django-concat``, and ``hmac``. + #: + #: .. versionadded:: 0.14 + default_key_derivation: str = "django-concat" + + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous.Signer", + sep: str | bytes = b".", + key_derivation: str | None = None, + digest_method: t.Any | None = None, + algorithm: SigningAlgorithm | None = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: list[bytes] = _make_keys_list(secret_key) + self.sep: bytes = want_bytes(sep) + + if self.sep in _base64_alphabet: + raise ValueError( + "The given separator cannot be used because it may be" + " contained in the signature itself. ASCII letters," + " digits, and '-_=' must not be used." + ) + + if salt is not None: + salt = want_bytes(salt) + else: + salt = b"itsdangerous.Signer" + + self.salt = salt + + if key_derivation is None: + key_derivation = self.default_key_derivation + + self.key_derivation: str = key_derivation + + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: t.Any = digest_method + + if algorithm is None: + algorithm = HMACAlgorithm(self.digest_method) + + self.algorithm: SigningAlgorithm = algorithm + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def derive_key(self, secret_key: str | bytes | None = None) -> bytes: + """This method is called to derive the key. The default key + derivation choices can be overridden here. Key derivation is not + intended to be used as a security method to make a complex key + out of a short password. Instead you should use large random + secret keys. + + :param secret_key: A specific secret key to derive from. + Defaults to the last item in :attr:`secret_keys`. + + .. versionchanged:: 2.0 + Added the ``secret_key`` parameter. + """ + if secret_key is None: + secret_key = self.secret_keys[-1] + else: + secret_key = want_bytes(secret_key) + + if self.key_derivation == "concat": + return t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) + elif self.key_derivation == "django-concat": + return t.cast( + bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() + ) + elif self.key_derivation == "hmac": + mac = hmac.new(secret_key, digestmod=self.digest_method) + mac.update(self.salt) + return mac.digest() + elif self.key_derivation == "none": + return secret_key + else: + raise TypeError("Unknown key derivation method") + + def get_signature(self, value: str | bytes) -> bytes: + """Returns the signature for the given value.""" + value = want_bytes(value) + key = self.derive_key() + sig = self.algorithm.get_signature(key, value) + return base64_encode(sig) + + def sign(self, value: str | bytes) -> bytes: + """Signs the given string.""" + value = want_bytes(value) + return value + self.sep + self.get_signature(value) + + def verify_signature(self, value: str | bytes, sig: str | bytes) -> bool: + """Verifies the signature for the given value.""" + try: + sig = base64_decode(sig) + except Exception: + return False + + value = want_bytes(value) + + for secret_key in reversed(self.secret_keys): + key = self.derive_key(secret_key) + + if self.algorithm.verify_signature(key, value, sig): + return True + + return False + + def unsign(self, signed_value: str | bytes) -> bytes: + """Unsigns the given string.""" + signed_value = want_bytes(signed_value) + + if self.sep not in signed_value: + raise BadSignature(f"No {self.sep!r} found in value") + + value, sig = signed_value.rsplit(self.sep, 1) + + if self.verify_signature(value, sig): + return value + + raise BadSignature(f"Signature {sig!r} does not match", payload=value) + + def validate(self, signed_value: str | bytes) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid. + """ + try: + self.unsign(signed_value) + return True + except BadSignature: + return False diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/timed.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/timed.py new file mode 100644 index 00000000..73843755 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/timed.py @@ -0,0 +1,228 @@ +from __future__ import annotations + +import collections.abc as cabc +import time +import typing as t +from datetime import datetime +from datetime import timezone + +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import bytes_to_int +from .encoding import int_to_bytes +from .encoding import want_bytes +from .exc import BadSignature +from .exc import BadTimeSignature +from .exc import SignatureExpired +from .serializer import _TSerialized +from .serializer import Serializer +from .signer import Signer + + +class TimestampSigner(Signer): + """Works like the regular :class:`.Signer` but also records the time + of the signing and can be used to expire signatures. The + :meth:`unsign` method can raise :exc:`.SignatureExpired` if the + unsigning failed because the signature is expired. + """ + + def get_timestamp(self) -> int: + """Returns the current timestamp. The function must return an + integer. + """ + return int(time.time()) + + def timestamp_to_datetime(self, ts: int) -> datetime: + """Convert the timestamp from :meth:`get_timestamp` into an + aware :class`datetime.datetime` in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + return datetime.fromtimestamp(ts, tz=timezone.utc) + + def sign(self, value: str | bytes) -> bytes: + """Signs the given string and also attaches time information.""" + value = want_bytes(value) + timestamp = base64_encode(int_to_bytes(self.get_timestamp())) + sep = want_bytes(self.sep) + value = value + sep + timestamp + return value + sep + self.get_signature(value) + + # Ignore overlapping signatures check, return_timestamp is the only + # parameter that affects the return type. + + @t.overload + def unsign( # type: ignore[overload-overlap] + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[False] = False, + ) -> bytes: ... + + @t.overload + def unsign( + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[True] = True, + ) -> tuple[bytes, datetime]: ... + + def unsign( + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: bool = False, + ) -> tuple[bytes, datetime] | bytes: + """Works like the regular :meth:`.Signer.unsign` but can also + validate the time. See the base docstring of the class for + the general behavior. If ``return_timestamp`` is ``True`` the + timestamp of the signature will be returned as an aware + :class:`datetime.datetime` object in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + try: + result = super().unsign(signed_value) + sig_error = None + except BadSignature as e: + sig_error = e + result = e.payload or b"" + + sep = want_bytes(self.sep) + + # If there is no timestamp in the result there is something + # seriously wrong. In case there was a signature error, we raise + # that one directly, otherwise we have a weird situation in + # which we shouldn't have come except someone uses a time-based + # serializer on non-timestamp data, so catch that. + if sep not in result: + if sig_error: + raise sig_error + + raise BadTimeSignature("timestamp missing", payload=result) + + value, ts_bytes = result.rsplit(sep, 1) + ts_int: int | None = None + ts_dt: datetime | None = None + + try: + ts_int = bytes_to_int(base64_decode(ts_bytes)) + except Exception: + pass + + # Signature is *not* okay. Raise a proper error now that we have + # split the value and the timestamp. + if sig_error is not None: + if ts_int is not None: + try: + ts_dt = self.timestamp_to_datetime(ts_int) + except (ValueError, OSError, OverflowError) as exc: + # Windows raises OSError + # 32-bit raises OverflowError + raise BadTimeSignature( + "Malformed timestamp", payload=value + ) from exc + + raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) + + # Signature was okay but the timestamp is actually not there or + # malformed. Should not happen, but we handle it anyway. + if ts_int is None: + raise BadTimeSignature("Malformed timestamp", payload=value) + + # Check timestamp is not older than max_age + if max_age is not None: + age = self.get_timestamp() - ts_int + + if age > max_age: + raise SignatureExpired( + f"Signature age {age} > {max_age} seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if age < 0: + raise SignatureExpired( + f"Signature age {age} < 0 seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if return_timestamp: + return value, self.timestamp_to_datetime(ts_int) + + return value + + def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid.""" + try: + self.unsign(signed_value, max_age=max_age) + return True + except BadSignature: + return False + + +class TimedSerializer(Serializer[_TSerialized]): + """Uses :class:`TimestampSigner` instead of the default + :class:`.Signer`. + """ + + default_signer: type[TimestampSigner] = TimestampSigner + + def iter_unsigners( + self, salt: str | bytes | None = None + ) -> cabc.Iterator[TimestampSigner]: + return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt)) + + # TODO: Signature is incompatible because parameters were added + # before salt. + + def loads( # type: ignore[override] + self, + s: str | bytes, + max_age: int | None = None, + return_timestamp: bool = False, + salt: str | bytes | None = None, + ) -> t.Any: + """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the + signature validation fails. If a ``max_age`` is provided it will + ensure the signature is not older than that time in seconds. In + case the signature is outdated, :exc:`.SignatureExpired` is + raised. All arguments are forwarded to the signer's + :meth:`~TimestampSigner.unsign` method. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + base64d, timestamp = signer.unsign( + s, max_age=max_age, return_timestamp=True + ) + payload = self.load_payload(base64d) + + if return_timestamp: + return payload, timestamp + + return payload + except SignatureExpired: + # The signature was unsigned successfully but was + # expired. Do not try the next signer. + raise + except BadSignature as err: + last_exception = err + + raise t.cast(BadSignature, last_exception) + + def loads_unsafe( # type: ignore[override] + self, + s: str | bytes, + max_age: int | None = None, + salt: str | bytes | None = None, + ) -> tuple[bool, t.Any]: + return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py new file mode 100644 index 00000000..56a07933 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +import typing as t +import zlib + +from ._json import _CompactJSON +from .encoding import base64_decode +from .encoding import base64_encode +from .exc import BadPayload +from .serializer import _PDataSerializer +from .serializer import Serializer +from .timed import TimedSerializer + + +class URLSafeSerializerMixin(Serializer[str]): + """Mixed in with a regular serializer it will attempt to zlib + compress the string to make it shorter if necessary. It will also + base64 encode the string so that it can safely be placed in a URL. + """ + + default_serializer: _PDataSerializer[str] = _CompactJSON + + def load_payload( + self, + payload: bytes, + *args: t.Any, + serializer: t.Any | None = None, + **kwargs: t.Any, + ) -> t.Any: + decompress = False + + if payload.startswith(b"."): + payload = payload[1:] + decompress = True + + try: + json = base64_decode(payload) + except Exception as e: + raise BadPayload( + "Could not base64 decode the payload because of an exception", + original_error=e, + ) from e + + if decompress: + try: + json = zlib.decompress(json) + except Exception as e: + raise BadPayload( + "Could not zlib decompress the payload before decoding the payload", + original_error=e, + ) from e + + return super().load_payload(json, *args, **kwargs) + + def dump_payload(self, obj: t.Any) -> bytes: + json = super().dump_payload(obj) + is_compressed = False + compressed = zlib.compress(json) + + if len(compressed) < (len(json) - 1): + json = compressed + is_compressed = True + + base64d = base64_encode(json) + + if is_compressed: + base64d = b"." + base64d + + return base64d + + +class URLSafeSerializer(URLSafeSerializerMixin, Serializer[str]): + """Works like :class:`.Serializer` but dumps and loads into a URL + safe string consisting of the upper and lowercase character of the + alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ + + +class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer[str]): + """Works like :class:`.TimedSerializer` but dumps and loads into a + URL safe string consisting of the upper and lowercase character of + the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/LICENSE.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/LICENSE.txt new file mode 100644 index 00000000..c37cae49 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/METADATA new file mode 100644 index 00000000..6d0348d9 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/METADATA @@ -0,0 +1,75 @@ +Metadata-Version: 2.3 +Name: Jinja2 +Version: 3.1.5 +Summary: A very fast and expressive template engine. +Maintainer-email: Pallets +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +Requires-Dist: MarkupSafe>=2.0 +Requires-Dist: Babel>=2.7 ; extra == "i18n" +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/jinja/ +Provides-Extra: i18n + +# Jinja + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +## In A Nutshell + +```jinja +{% extends "base.html" %} +{% block title %}Members{% endblock %} +{% block content %} + +{% endblock %} +``` + +## Donate + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/RECORD new file mode 100644 index 00000000..cc15d0b1 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/RECORD @@ -0,0 +1,58 @@ +jinja2-3.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.5.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2-3.1.5.dist-info/METADATA,sha256=PJNSUFNBwoqGA2vce2XSP8M_p2EYqAHYI7hoWLABtFo,2593 +jinja2-3.1.5.dist-info/RECORD,, +jinja2-3.1.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2-3.1.5.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +jinja2-3.1.5.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2/__init__.py,sha256=zpt8UHzpS2eB1c04kn1LkKkaXLXXcKd33klq7UJGIgg,1928 +jinja2/__pycache__/__init__.cpython-312.pyc,, +jinja2/__pycache__/_identifier.cpython-312.pyc,, +jinja2/__pycache__/async_utils.cpython-312.pyc,, +jinja2/__pycache__/bccache.cpython-312.pyc,, +jinja2/__pycache__/compiler.cpython-312.pyc,, +jinja2/__pycache__/constants.cpython-312.pyc,, +jinja2/__pycache__/debug.cpython-312.pyc,, +jinja2/__pycache__/defaults.cpython-312.pyc,, +jinja2/__pycache__/environment.cpython-312.pyc,, +jinja2/__pycache__/exceptions.cpython-312.pyc,, +jinja2/__pycache__/ext.cpython-312.pyc,, +jinja2/__pycache__/filters.cpython-312.pyc,, +jinja2/__pycache__/idtracking.cpython-312.pyc,, +jinja2/__pycache__/lexer.cpython-312.pyc,, +jinja2/__pycache__/loaders.cpython-312.pyc,, +jinja2/__pycache__/meta.cpython-312.pyc,, +jinja2/__pycache__/nativetypes.cpython-312.pyc,, +jinja2/__pycache__/nodes.cpython-312.pyc,, +jinja2/__pycache__/optimizer.cpython-312.pyc,, +jinja2/__pycache__/parser.cpython-312.pyc,, +jinja2/__pycache__/runtime.cpython-312.pyc,, +jinja2/__pycache__/sandbox.cpython-312.pyc,, +jinja2/__pycache__/tests.cpython-312.pyc,, +jinja2/__pycache__/utils.cpython-312.pyc,, +jinja2/__pycache__/visitor.cpython-312.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 +jinja2/filters.py,sha256=cvRI2pqXNMzw8ba41VOBpgu_wu1r-l1_QxwD6yVoJ5g,55025 +jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 +jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 +jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 +jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/WHEEL new file mode 100644 index 00000000..e3c6feef --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.10.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/entry_points.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/entry_points.txt new file mode 100644 index 00000000..abc3eae3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2-3.1.5.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2=jinja2.ext:babel_extract[i18n] + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__init__.py new file mode 100644 index 00000000..d669f295 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__init__.py @@ -0,0 +1,38 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" + +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.5" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fa20b4430aa94c03a493387e386e47fcba24051 GIT binary patch literal 1659 zcmZ9MTW{Mo6vyeZV&pk@gZU~A*NV9G$&=qKITZW_vmKGQY3<4u@HWP``NIJ9g zw7u;cY+qrYW#7PnfB}2z+lFEHU&N=r7$! zpQ-oo_NNR&zak%DV+n z8ZH1^*fKl|T*O7g7H|od3>SgRxNNutT)`E?W#B5V8mHhP%Lvc+v12@Dg4!JP*8#mklof zuizEKi@|DWW83f&@ETq-ybQdK*A1@#Z{Q8XtH2NN1H(4(L;MhU4SzIR-`u$Q?Q6y_ ziOr-L3Ad1?Q_ZX-4kAf*hxy`s84+OQ(Myen2ZTnc+v52mjPa(_V5#Rdu^u(4U zuE@|z}>aMqTe;{{WQx^Twp!CX@fmFU3Sk*NeEKLk0ac)1Igj@anhTH3=pH>yif4Q!W{(h)R#d^k#Z@ zduRK}%gv9+dDrzL&vnQ73(rg~vQTLvr)3&sT%4Fe%xD`vVrXp9p+`;8N>R}6tQP&H z6Gbg0EoChgka0dRZ%>M2 zJr`Rro4&V_gZ!P%WHSFuWiz>dEtL5rL0=~5FhRQs+Dgz@3Hmfa&k}TypyvtNOVH=W o-!b|$K~E9{48fpZm?q?YmY_!oa?&3(A@b>;mG;j?@d&2;52T9c!2kdN literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf17025b51557c71e165f813531aec42385448f0 GIT binary patch literal 2140 zcmYL~J8UDz9mXjM$;B~Trb`i|vx6~XyGRoR2$04=oGNLY1c_oXw$3`8BIz7ln($5P zu@+alBSlH1R$RVzm#ZbY%ZJ1z38c-VaB=ckj_*HIAyi4g+7{l59nw=@6Q zCBeVH^2)bE`275>FW;}<3x#gv;Oo!A|IFPFVG5z8(9+yW=-tqKC=$9q|8?m9x-@Ui z{de^4{NuS-7rvB(Up)E|mi_f_{`|MWKceiP&c8CBB-kgJXDWL(em1>|UB$1GSE;Ma zr#bfN(eoYl{PcPII?t|8u20!@^}2E0yf)dj{ki&ioBezHi#q$F{la1|+!tfg@{F`1 zX~z(qv>K#AngOxttjOr>nDhfi`WfjuqiTYxmk^(-6GpW?s;Q6y)hblesUBlgPf*>b zI%XS5YGkO9rN#~h3N;GUs8BapL5pAz5;^AqqJKYDXEhlhnp^CrKSlce2#MbVs4iQ|jcYQ=yJdU2N7(P}ip} zqHdC0MBOa8h`I{7Psz=bTOn5`4@-Ip@9{6zUbISD~Ix{W$d# zG}xxW9;3k%8suqk2zN?@E)857c4+7^8eY-`p2Nk*blIUx6fQ65azvLtjk1hJ3i*fR z7s>CDKOp~t{0aF}8h02?k~B%vBtsJgg91(Pjwe1%(>!W19-Z)5p7B_b$I1|m$10F2 zk2N4Rk98m(kH;C0D?Gl(<415Mu9O&8PWj0`<0nt}Nf+Yr(mpR8@KTqTTweAVKRw{5 zC9dr-t|`2d;*~V77`&=6UbT3&4H@xff$`=sH=Z(Xl(~U9!{^47o0vAoycK1S>kM#sKK>o$-`OleC9fA=5}Vi>1?2}*Itha9PI3v!f6S|zHOCnhf#Jr+`AoW5a)L2-VVLn3x(ZY?A`j)AeR{j zxg9OYDSd{^Wst*f6_*4^fi&2ag*`BoMn-U-RRi@P=T%Yk8bNNHh8gDqH5z5O!~ybZ zEDfeGaa7`MX)XgbDKkk_k_~CRKux6pvMD!E({eVA*|ZCjiGnR@b^|rrg2@iRBv5xw zG1xH!bywc7n*bx=g9!>s5@bLY?8t%w3ZMdXP?yCPkbNoWBG-da(S}+M)O}e!z^Zu% zCf@_{Lq5&AkQ!JJrus>x0@oK-$hwYd%CX_^;cBn=K=pgTjw zz&H+6a~sAi25MVw*X{$kU3(g+-F=vD0~pd^%Im;*(qIPfy z0H-M7EtS$KX?B1qjUAM>;xJpupwz^RDK+~*hK&~J1tk+R<}nK9DL9kH3Ci+&Q;w!V zR+>YAOgVZ6bWjC&Vdbb9l=U2po)5~kBus7lPQy3qPRlsI{lTjXpUtmFKD+nc!v|~2 zD==$|o12mKRU>pK|69NMefU=!k@bymd zrO4{$@*kHY>#wgp{_0yle(-SV(Msee>n~wL`S-r@JzRo?xw*OP&`ZHLLoa_P`~AJw Zwq6V7L*Mx8ckdSFU!ITMTgQKX=s!%L1IPdX literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffccdae0bb222b271401dabbae1140e40c0fc4fa GIT binary patch literal 4980 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49be60c9af293c45f538c87208668033b249f80b GIT binary patch literal 1562 zcmX|>zm6P55XN`GAZsKCMj}O>I>0O28A3=%COFAwBO42e0IRpBcDK$w-E;kCq~k>p zkHE7Kk&+UTS#suxU(Ft@W~;vGsjmL|tLpya-o0VN@7a@oj=z1f+5BxU|NXYN;Qd{| zubXl6)8=OT;3NMPf!_JR6Z%wra(?8|S!>XAbY7C!VASjGr?Z#l{A4CIaei)+z$J9& z+u(a>xj5gCUEE&xlEyx{ee`M6=0fzfx{#+Sj~UP4#B3tKHUn2BG-+MRu)eS?^K$BY z_2w5JqmrX|41>{zEkQ4SudSCAk*Sy3s~i2S`(B4pVLxiHwa%_Kz%gm9YD0wP2=g%~ z32y9a|LWu@wXqbwIfwyWy$S)8 zx|ln5SRzU;xV+D$u_(gIG(>uX@X1Snl!0UNt0iReQEK;WYNAKXHkUd+)ESank- ztf>qD+s>4sZLaM3NK8U=k_RRfK+D&(m6bHf8CjyF`xAyzV4_Po4gC8w-GFO@dg`Y3 zYRT7AaCy}1atVq_zKENBVGXtJpJn7-V&p|C>kKnHY->%?+RY~>SXw|O3<@(+t}O#- z!WWb}+h*eNUO59K%67ig&BaSy*CLZrp1J6R0CUMyaqe+ZSOE&j*Ry(U{cFbdT~0Ys zx}hlD-;DsWn(eKStooy_dRNYiB!_;H23n_98C?}(#QFw@nkHh^Hq;!HRm^3A0i)Fs zPjv#vafBS}1TK_j09`n1^l77`*j78M(a4?4V2;dV@g;OQi#nVy) zUJAuqa_nv9I4(WTy-~L354L~ZfA-?#cb9K2zJK-l^39JgUOs*G`{upfwjX}py{=N~ zPTu-dPgk1IW_NM%!{zSs+oz9ql;#(Dy-C?YV%c$ocJoc6P){B{db~qk`EvH*t>+5b zG5g9t-r1FC2fjX>Z$8}pnp>qu`KElza(2Vldzg10Z@1fbcRu_4i$6E_%N<7k1wRQn A9smFU literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15334db0a5ea3ab4afa1120ac2ba84b833d89cc2 GIT binary patch literal 6587 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 Deak2h literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..399b1350247a724c5dd526b41c4d702f68ae2720 GIT binary patch literal 1612 zcmah}OK;mo5MJtKJuF#I+me-c9al&!AxTlRK+-^w=|r_8JGR^hn}B7tYnwJjDN8D; z7#IzD=`}t%1p>s^{+3=;_(E)Jpg>U+zBx!wIdzs1EB92A+Wq$1Z+2#9cJ*^K8b11Jam-{aUacl0ps+ z01iuG2af@cND&7I0gp@L0wTh8&UH5Gsn78flO}LTisP`9z!52l$E6gGN@*OEGFXr% z!L~TEaS@r$0wh^HaT9vb<^D$(cXSD91}CIEPD*ER3aryZ_AEI^&XX_+kq8;bnU?|S z0-nTESb%pLepx)J3OIptFN4xW@U-a0G3v=Q@b^Yz7j1Zkk4(r;;m0!nWZolwOjveu!bEvsFl*XD{(J1R^73N@5AF}g~N zSe~b|mS=Vs`lps>m-m+}&!t_KsZ|@Iyw)r?#k$yN$}6klV)YA_a_Gu({S>+QRtQ^X zO;W6>CivC9ntPznT|GbdfV%zMLl$p{pTApDyuU6sDqnc2|WA6cwYTs;N`PQV0Y_zrrWW<^WUg6Pn5ou+BQ0R5%=0%L*9TX zQ|;(h;uN{_1lBXGIIL4tuYIH!O{%ur1he>pxL97VLFSfg)k;-dE6lQh+3%|QCKF6H zwxMc}ErY_vLTthn4-3ouCNWHdI@^r8lTN9bzh|nNK?7h%$9NOu4Zn{p+Wc}wlq>hd z%2Ks)mnGi0lOZ;u8xXm{JSJhuJGJG?60hxQ6WUcSjlbi>#)8XaJ}a+Q%XezdAs7i$ z|I(+lY4yR0 z<6IdIX_N~xOQN_UH&@G5I9GS&;rXI5n4=S1kZ|+XDA&ccm2yR-Q=IoL@bl&^>;0e5 z8z9izhoyA`YEdFPif(Let2$P+QnlKwm+Iw(Yo$j$)oLpSl&kcZ=#NX9`c0|ZH@7brOnK$E!vO4_NZ0gBtx`2oti zGg&@cmsQvLRSZ$E} z@DSayr_X@xNf^aa_ITWmU9@9q{v~p+qhlG*03}W)(abqJnFn8X{=7XkZNo4(dteT- pSHb#qBJ@7U;?FPaU*5a?BK1OfMSdhNa=#?s`x}J>54{e1{RaWN&lUgx literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2b0f20fb7b812128c0e19ea2f6d5fed1485a0cc GIT binary patch literal 76664 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≻BZE4CuPD(=5i-8!kpb75z(WJ`^;B5Z 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 atzS~rnwtvGse9Z?UF+%m50olFl>R?-5LXcZ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1a577facc4020a532322f4a1473c28ec1025a10 GIT binary patch literal 7726 zcmb_hTWlLwdOkzWki&~aU1;4L+ap_EhmI}9l6RBXP93jrao16r*xokk2F!>vl1Nje zGBdO+hFW-A6)Uw#ZJ{khZ+2lBSs*t2Q14UIr_Htn`mhfx)efRey?}u3OWx#2X#>Bs z-+zWPqGURNfgVU_&iv;x=k|a9_y7EDU0s+Vo$dQ__;<~W{TIEsDOf42K0;xRX-pHc zY(UV3jOaF5e;NVJr}?w~QE@;Nn2()inmENYNtf>UomK+@E)75$)PuUL2kuCfnh>v% zQ4`WbUi&bYh9QlhtvgDDOQVq1=@CyF<P%M!n8!ThFCUkTzFIV_X`C zbW4@AVM0i>d`Z*n|58AHTd+eHa+*Gr&gojpnZA=(*1}dVqeZ4EVL6 z=GVmx-|Om5jOl@P2sBai4T;liNYJFIx&iEtCVpG{A)gkQ67N)o8VF6Z%fdkT981V{ z-FbaZYj<>vq7H1fY3WAKB|UekCz~GZ8Jn<1^0~h51HC&S>t=$Ba$C9eGr4mWGM1{Wj>@>(mHjw^!W=8H z3`sX7BUW3k33S}&piDR{U%x?vB?MbkjbZb)VASK)q>m{EO@{APam&UjSI&x7V{S!u zg)Q&cbz|aZ6Vuk!iJ6IV<4kEm?!BcUGa6}-2(mdB-XP9{h5S|Lm2XfpY3 zLCscbg2|+oPeCkLw){HZIyGziP0QfBXUk(o9;a$eIHy=wImMKo%_ftWe~czY^MA#e zKS78=8U33lkbN`7z7Y346a{JLyzp`OX82a$&DaXV>n8`lrpHQv1?pFPg49=TywP#J zWB&N{9bciMZ`F^AHL7ryMMG}TKoU?|y^CyJ|1JQxpn<*tQI|4N-eNnN z%33LFqm0hgAl)@OD5F`}v1C%sLB~{XJphQ(g&cH?pRbWXi`&c@m&3F|{U{@NFtf=1 ziaqp6lDyKyl&&kMr{B0bFf&m0&m`}OyH>)i>)D6FMoC$&k6q2oWPo$6*IVbC=PxdF z9$0MeU99h0kx&gJY-*nCnC&PZpWU%S9adx(u3rsN={thdS#DkfFm^fXp zIX-L_NUmUV1eAQvk0Ucs*F|Lyk=4OG_9bm8gE~#ngA`h|Ig%gGVb6g22EGBvCj1BY zvnCX%4B9_7TU7(PbHmZ=z_%^&2|3Ws_2e=9Cd}ko|2z(n=pj%!%Tbw)3WUnTY*H)< zC)nGE8JmPryDoN-LtyVe_oRMRZC)0c=C5S|EJ9A6 zEFxY!l|9f2GKNAG?-A&ZjkV;_fgdaKZ{gTh^4|_yt!_zuJ zh8^*25$s5y%8nF$`;_9dxqMEin?Q$URhYV2G27!hF8B~pgG0)f|BIA}8eRB+b3T|2 zvjghbn4Z(@rYig5vU@R;Pv>m^s5<6AEs-I|Vu^JBj6HZy$d1M7p*nuzbYQkLrW%%6 zF;Bcqfb8%+YDLxv=}MJF>Ts3V({s-x9YYWE17u*^fWv4rw?WJCmg$qrZQH(LV%?r= z;)CXGWo`b<{pRkac>CPh*|YQU&pTgS?0oUF_)E*Ki!8egJjwQzLMFqIR=;JG4TNcd&Z z8}2^`bWqX3tUe0-wMI6mN_T~F2D0$bb9v{+%0ua_&N(QDFAsvSHi9k=U*yGY@@}Qa zy<1KbJu*}BL!GHNPbCp=qWcCYU`g*w8WBj3UPAGG{ihN^!_z>6d=H1_y^N9_F!Kci zgfVOx@P^5q*Af9oGr3Z3Z0_hG4gZ)HK2u|xJw5z$^e|sQ20dJ>XQBFv-+N!~Txxj+ zbT8tvzBUDKbxV7mBOxx`R=j@@62N<%3{6pA`l7MlWx?M&I!3KrV#O|@(cL2Ck1g-bRTfLWo!B1jl)d;@?|t67f3bD{z1E() z;y*=x75PN{Rcx{Km1`o@wy|X{IvXwja9;a3b2IZ%c5z$p{f53}Ook#yTkgenEXX^) zS&OjvcEnujwtUeLU-9Gl$Ry9^Upn?4e}Vn$3!xK!|G)VJ-;+C={&dc&azHtYpsQ#6fU=r=0$iFIl>Hh0O&u8ztepi9>fF5q|1uJTf7uvc zk?_PtK`BTjnSo)D&)GbaUkQ;U%y47(&h9Oro9$VlUKk==|8*Uec5acBa`P&~4M z?Mvk;vIQ^8glja;Ie?iT)h+ImrMX)ZCZ)C9xOPefXV54}#Um>Us6#40I!35NVHt-^ zAh4C&V<|a3MX_%qot?lJs2?9|a6(a)>Z!n;d^JC=VBPlq zTqP&8HlmuGub32pQ!OABJX_tYgv)M=HE#*sI%n%?gN=SS`x_KYa+{{uS3Xgaoil-Aa?CaNx2u9a$@YOVD&N&f4Nv&thi zL##L!+%>RJigts1DR~4uAB&ZOYu1|bd73h1*YVFy$`rH3Q_kU#{HZ2fcTP_gjI=f3 z%=b^feZE?r@4u@X`01xWl$pDe{3J}ocL(#AiA94EgF|cIw);P%rBL<@D!fS<#n`y$ zsaDYpn~$Gvjv2#+Q9WllYk7kQXmt7&isoZf1-n7m(VU{s(8?@k=`j6t4(=^}f-urJ z6uut(aKcA)0zkD7gfP;e>?10yuYyF0Mmu0lj3FB0Fpj$OZ~e*1&cF+A2<6ruCl_|SVlmfm*b?RnvXP~N}B=(#o|NP@hu?fEr^=URhbkjpQxF+A3yf^b?`*pfgX5rs7w TvV}MX;dS)V(fu{O@MHf!u8^X> literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea07b09c0b2a83277f8e7051b566b96c3a3f2194 GIT binary patch literal 41919 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 DmpcLM literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3e757f9b2fbb126428e2eed78c5d6ded0810937 GIT binary patch literal 72559 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 Wt`(HW{qy2^b0$7TpDQjodih_FhL5@c literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e6a493a12e025bf6a149e8804ab8a84064ff0bd GIT binary patch literal 19198 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5435ae88f4635297d7b197a5a1f75f8173d25a5a GIT binary patch literal 32076 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b8190905e7d0cdf602d068a45fb2ba0e88710d5 GIT binary patch literal 32355 zcmcJ2dvsHGe&?00t{%2z$xr!(xyA-t;MlwphyjDaJOj>)X)+`kTUavK$d+>@19n7) zW^x)i%@%vosm+;8F+J0RX*wIHo!yXjrb(vRGu_kfIT9kZt067Bo9@}1?jI(mJDK#H z-Ti!jzx$Ac2+6d2ef+yuzx#VXzVF}n{C+Rxd`=MlJN?iutNO5f$Serc zLO?hs1WW;Q$aKui?&2|#-7Uu~>@FRX*xh=}#_slGc6N6hbKow93Wf@g6`H6FOUOCo zI_6@}Qph}1bgYOyTSM+4&oK|4Z2^0zc&Ox9343;gN{7mhm6?Q~ZE&sDJmao7k-i{Q zG2}hwW$6p?TzRY#&(2^~z=d3!jnvvxu&N4={gyz{%a&s`W?{b&aK9`BJa3}6bRDZ@ zam9!$3D&+Ts;F|{R8SeLbNb4Ij`&N%X()rjy**_eR2ZlyM!J*)A)E^xP4@czwup)=T{=mTS z2{{_XOMf(oSS36p2L}54g9?($0e{qA5DAYeeZfd;!KXB)-9A%V^dIlT%@R53-+;Rd zWrvk$&rmop8VVw!;0Sv0$7@G!L!KkZtUv|Vdp+NuPjqsnj}m8xA9JkXL^{uW}Vg%iR#Q%o4lOrfR>nBG)l zyM*U{PY}+Tqv`?_gh47L=Nin?$=5NRLF1%aPy-nz9I6XCpxcOKS)TBL3ll=$PDhGT3*jRhAF-%g7f9 zMuUCPNPskOBUCCJf}LAA7~d}bgNk`@0zB#07vwH2T(nqE1mC}E|QW&gs|_Jyg{ zXHQEJYEs%9j-)NrsZJ~kV zZ6jmRli}e_ts6GBMFyh52S)sTr~D^^kv8NW^lxmVt%f37N5;~nthqhfn(m<{D>bN^ zKvU!;1m}e%yHMmgzi+X)YPxQ!ZdObcH-0AArTVz^iL>a!{)zn;9+`M#=E0;>zUe8M zwoTcli@sa*!;M$AT;6h}<8sIRHF%$IBzZI_BJ7F~C*`J`mk?ABCCOTyWb zc9l$y&Wf+c7M&#*j!YbxS^beyUMfZfOC^G{JiL~EbHI*Nu3(Wv2o$jv7of$3_pH4xUr9(U-yLtXC}0gZ`|SbO%hH=_ zvSY<#4xc++u-hLA9%k#n|5GeA`q>xqM>s6@W8G_uM3$c%JX6+VrnKM)AY zy(fav9uAXxhP` zz+QLC=*^gX+#ea}lY?jdgqs*f@~dOOYYm0Nry}y`NCtumb8yi=5aJa@#;^~EIX*!UMs6xu<6UP_n0|IT8%@w=gh>Wb`)k zqL;i4J6IBhzJDPx{n^zqA6H0#+8nL5RCvT8DN+|`zWet9??Rr}ve+4Gc2 z&EilzcW9fn1?Ib}WHyfS4t+>@;ddoFGXTUB1{mk>Wj{91-9tt#;JXAR_O~iQf1vs9 zDmgi!Cgj84B8U7##{>R$S#3|=1|3ZoW{j{xIGCXng>Y^kArkG9@Ib$p6$H})NE7W% z#ywIW)$>Ft2fGZkosSgxKIr=&=t%k{Q`Dj7%ZT-v{coY@{d{xkD?#rv?WAG<5YR1% zL?uX@T0R*J0gbC0QkyT1bZJ-*MzQ@z0Jwq#9kM|Rm7?X4^>R;QjzB1=qs^fWl@uMN zjjxgbjBM!bZRWGqB5N&c0R)JKL5c=_y?`T%Mjq%3Lx(asWP*&P3X-GGKim`rZ0JJ? zti4+MRA596A;_q%7LW^3Io!`u@&;2kSwn{aTIJ)s5H&SVs5eC`nieG}pr``!x|Nl# z^+t}IWUxvth7D0pA(T|k0CXyhP=YOTnC@plHt9|2?d=W^2YY*S zss}n5rHMN}CO^h#7Bfs+EQ;|4 zG*%~6on4MMdbLUHmHS7B`-lnQM4^9FMPgJTUx37upbo6d;~_M4fYzHobjCjxVTg$4 zBh2YaY9VX8%3bKaC!}{G7(f->VcD;o7*#1$g-A`dawB1uQ)`UOCKsp^DNv$bP#Ab6 z0;Y-9$58MLjkerO%#((;&{-heP&hKG1bsT4%U2GtAXM2dq9XX}^GWGqY%P@<=;2Ay&L>8P2_x+#QaNpjf(uLAdwOW4 z_4F_@*e8N_14>a=0%9<*6(Q(D<6n(?y1>9DYF8XH%q-Ume<=CO4lSy*Ca}s5>1aJJcpM>b7|3%V0IPVu?p^$GiOsp%?W$6Qi~F@ zcsXhY{Vx*{H!VbUF3#ZHUNZU2PK3_^jS|}@iW~?d9gSsV zbcCUPB5CxY282+zq{eo%2ha9_biuf>A?%gUoE+!_ufrEIu&sYIL~!7w|MY;yjL_m8 ze}GYIYOU)0VM9MRt6Kw;=?LS(!uVJ8l%s!~2HSLW6o-$^RS!2?hYHQ9p zVvc;M4(+j=FGcw}ipwZNqB1mL2vXXAv+>(`OF3T|v&0-d)Khk$O*9laSIqIIy6Q}5 z-=N0#WTYC*$1R&swivT%Jpr$5_S4cn41`L!K*J1JokxkLSE*}*#Kn5m(r5s*&kyEV zU#P0U21|Z8NZ^}ja)OlYR8)Jfu{ipIupl`AHWYAA@uO!lWKHavY8wAMHC8 zjHWFVpSJadhem*2(*+T5QR=HAZQOep>7I5Fx6s3cQUz>RayYpTRVXbKtf$JX90sTD z8fH)1H58W?kN5SZt-SaM(S`&b_{AZtg+^}Now=hCaSACTe~ti9wHi=0ZdoiWiSJyj zsEqH2L}1O@D?OKc=AU`LF|~Ss(!MHgowUz1 zWWH?v?E4j|@&oaGi=|c5+ora~yO7-JiEm#lt>Z9y_ViqI{^?X{2VNBjPIr9g%;`%n zTznz1a^qrkU3}kbk1RUf7rH09XCAuYTy+aoxqV5uZ^6AO>E5*H^v;ycoSCx&zJU{9WaZHr9_4EY7eLzX|luiV(lr}}v(orI{ z()LG3XwCUUY5N{52_gj2mgC`Yh|jd;Fkqvy78w-+3F)FEqftt81o9m$+_cy^Jf^hc z%~gRlh>f~J{5%UNW8`lTye!-{S4#G!?LyUxgr$7RQYrZsYnqotx^LdX?zbET7rYbR z$r;ru~WH{Yl4xWeK^LHd~~F zrdiV!>t*X~8rNkqBiTtO=n4w)g0u^cNJvq1>s z*@xZ#Boi8N=;W^jKA=Y(`l?cJKjh#9X~GaxXdDU==A0T=Y2TxO+Kht+wkOU2lpN&i zr-AN4lpK$QL!;4PtNer(OG$wYKtk#XRpOV(mA+AhN!>N*tJkkq*4hea90)#e9K6h_ z_I8=e91U3j!4wcfJLKFxHm}kkTx6Axr|*QE1mrp(I&YKO{u5|B=yK|oR{H=@2m{aP zUL@#OfRaFx4>KGPR#0IJ=;JWkb}}SI)RF!H1!WKUqkSg{i)fYqtGn^csy0mw)}|F2 zS=A!1YEy}_jM(SYj<$oJ^AD*lr@pq!ovhE`nV*sh#ttL2(8A6}iWk`@Y9@C;Y15E3TS&!)Ji& zPet10ee4HT;n4AL2+}hatu0XMpE1fn^2DyGtPmE=#@4Mm>h25#h>t>BdV4b}0Ef*6 z3}Sj!%ucA1W}V9Z!UI{@V|X|WA=@*6z|W=aTL0388O1O$NOyiB^9FWlCTSlteYt8x zBQzC{!44pguAI@|i!sv)6O=!uF5!Zu&wN7YGe74AacVInBl+N5%<`s6@J*RttFj;$ zh)AJFFCXNk&|}j;3y3_SM_2HSA+?F+I3pMjff75qk%M**$jWf0JL$@|;``ha6bDeK&y!7zJ zhi4!E!S?Ib+vAqk+>4bmZmz|eHF3*F_R3#k=x)V&q{PprU)2&7ICRKY3cF!qx&sn3zT28Dw^Y_gGFh`K{*<#l33qO#wl@3{7sg`b{0Hx=_qJM1H zQa>nwHM0$3C*)pQ{paif*c=1|Er&_C&qxwl&AE(`e6=v(i0at5-yAQ97ee(?@Uruq zEw5)3gaS6kCKb;YZ>b6W`-deJjBc z#b-{NTh}X3qNE7TuPQ$I!m<5Ca5#8&MCllBy=!+GY+CDfl1YXl9j$u$1QkV-`9Fov z&kNV<_ssc!*a%{?DOtbgR}pIaOXXhEcsY}1^phH$AU}uC^0>KO_L(>^VNz%$*DuOT zIpUzv{L*5WvyOyD74SX|wupNeYt)~%69Gbsc7=w9jhpf9Q8el~vK zmm*@&(&AE5hA(*Jq(`2uOnKJEr6r5SvEq%!|1IFQR3vyR-zd4{z35%2@+GT$bIqx$ zP4iDD+&dEX9lxwXA*^h^7Jjy~xND90;Tox{&6Wj32+AyJ$ufCkbOfgn*GlfGF<{uZ+$W)`K}qO{rB^;OXzWLGw= z>IpYtV;wcIAD!mjOM*xczXof}lL^wboND?8Lhz<}qG$4`3_{zJWLAD_I z6Ut0L^t^D>Q~J6TmmmY;u)yhPi62tI>CE_ibYaW>nz_DI)y5^8P`&~Jk4kygJX<^&n~h%gu3Kza zH`h70dv^PbebKvecJ#WpWwCMvftcCmk1E&QE=BdXMKo$jLd)+!npQCx{OxlIdo2@_ z_{?8OqtX5cw(bLvZ$yWc?G%tkL+PMk7lO3(jbZRljA~EYpA0@f3SKA3z_@ah5_M9r zhXR7N%3ca+oRtF<)KWlnka9>1X7CXC4+u25Q-@F`FV@!IcDbacTV>_b`=|Cp+?FVA zn0@@pvCGHiP4C#=wp|kwJ04AJeKfiLvE=H<6VAtPi{|ozB?);jETt7oh4kbUDyjj4 z@l+%f6fL{ysZN$Um^h2>B+kO!5NGwxY`D~Zv3>UVT;uG?WKCP5xGm{ezbqlqQkTgs ztuUllcLe<8J)+L|%%2kc`;^Fxv}rsGI9d?L>3%#AodIBmr`+qD$qezj1~3^Vp#w}% z62+N7(op`y%rBV(0H80L&*)UfRde_FJ| z6}K&mgbJ-fS^1Jpbd~?hl8BdIFqO|s&T`>8 zUvmbO7g0RM&Z>6wJbq>kmc+(Wc?t1ZL&b)K1)v;-$S%Cs#s!<ONQW5QU#ZYgAG_-v1kzD&b(G` zU&oS-M4I=uWV2+5G+j)j>3WRY8mjWl5H{dfkZ1Ze^}lMVsEUnLk&_z9l*aAyL2md& zSVpsqP!nKhk#$&xV5~sHJKC<&1&ON0CZ`6%W9@R6E@~y~9#!0`Zl3@oQp}i=Ri>Ap zS?PVHaeGy{9BaNRabpH1khHN9j{-t)`4velHQm0Uom2BfG)Y@;?+BT9_VyaxW94Kt zA4!xjGkO~xK)UR4{>rl4$1*3kd6iKl$vs&cG?DJ3!=W*)7HTI%P*B|kNG+!cG)b1* zOrog(Y+~gRfJ;q_?SnLwbpT+iEqLMt9~`+EU=T(Z;h~}Mu#X9@RUJB+R?wKKHY8+a z4xcZ_F^iC`(`&VKt!OgXXdelVwD)e_xW1PeCPDtzN5Xq|OfMI}q3ACoa!87)-@OS7ZkLh7_rjb^~Y_(dC=3p|;4lSqYZfw0a+RYJrEE(!_wm5+1E zCyp>I)bk16?o(bK{_0KOAiB;$^md=z1w3VD$hZz1(>Z4z-UaJ=Az-e)U!U@na-Vwh zw0azkP&pomA{obn_GbyO!HwQafNcm84IT&LzcQ_7`P6WOI$xxvB1;Z^^vG7jb_l$f zM%>}dfn`t^2pW0LNim6~v}B}|&{iF{20%Ra=;GLDy_Pp7MOSIhgN@pgao2cR<;9pZ zNVIv*l~t-wdl_A)J)ylV+Ou)jdZ^tYuGL@WU9)ZaYyAP%E;`TpZ@g+D%)-ngAn2ChtKM=JPSaWvBLk?p%JMPnpe6!>*X6e59N$rz!88$?aI_!x#&e_o7 zoY{eV!DzpY3Hu?ZKrb8+^sA5vwr&O8X+b%K^2Z?K+ z6&SaUH$lbA6~gyPXdyg4zDLWcmupZEz;u2@b9JcvSSCdxLk0~sBasx5*723u@3>Vy zYa`Ckpp5YnofOfP>f;Wr=2qWIL#nC-(Py0Z%8-;;p&$n(qr8eY$^-=rvjBU59pfW| zqc~~HXmkLg(|%OhLj#qz@^OH{iTYsgA%!MX-3qD4(hi+fOBd>oL5Nw@RIs0e?Q7aX zrhMt@$mnr?(5;8d-BBnki^)EU33$?0W+w|tPFNW@0XZ=VoS4Lh2!(XPZ}>x_oSjTd z0}*s5U8LLi^(f(R)Ti1Uu@17XQZHe!iLNN$rAOCB3W!;7w}nN>3z60Q}hAgAtf-H%tj)AV-JJL}$F zm#p7$-L+$}rfJSJXHL|tiyyvK+Z?ytuvaZ=cdm1UC8MKaGIYb6)pUxOLH8o^aPE?1vK#hi}*qFM3x%f9Ztu znbeq{6qZl+zcH{-w<%e-=| zzMHjmm-b)Wf9deW!*dn$wW->Uh1$Kz+Pxnh|M`gzPW=4T2d7fCPsESFdT3<}=|^jp z9u`(Lf@ifeli1el?$$+5`LuJ&IdgPj#rEWi?H_q|+~Q456gR8y-gx5DQx~7Q)N`?C z?&w?3Tzw|B;^7;f_WxR1d9y-Ztf-#Zo~T|6sr0&S2+FrX6yPm^RJ@qXh^inaD8N}R ziz=9#j!ng8yXIO_-Yt`sPfE+Dw@huB-Z8afw(O(QHH(eSlSdZIsvsZInp=g;cZvjW z{bI#~^P$9pdr`$c)5^t_>k@UXa|6(els{}#$mKuGW|)@Om#BP0SV*tfUa|i=R9#e8 zqUMu97F&T^M3R;x6xMj;<9X0+~ATfm&9inYaIKot<7ij{`z zm}riqlsVTRO>xd;lu0c-Cw<#8*pQP1KQY4js4*3rP1s{nUInhg)rAm1$y%9A1Zd4S zwlOOc0a{)wNZ{KQ*NU43fdfgQ;Qc3ktP9@zE%-sA%Zp?~9o z^3oiXtn^UpdMTKtpoW6qrGRyT7!;+Cf&c~2QqV=g>j=`M|D_)ImFMWEHNdQO85&nL z9>$Rbpn$~1ZYr^^HjSXGzKb_jpeckyeOj}(AaTB1e({o|R#EwLvtU=a}sgBwD8>Njm zE7r`OO;xN^9$RC}>@p{g}m)jIcls%pce6_6Vyxrc7K z%P*XpI5%_j(sLJ|OS#w0Jw9KMaJMJy?Z5P)3Rd&K+^H1GYDmGoRcqb6KjGN|(J`XF zh|o6uSz&RPOZ>}{nyxD0LzmQ5Vf(Pk(X~nZaFw&GRs673!gC)6OuuxFeHZo>L3j16 zy`I2$IRCP7pbb#LV!Y9wG`I{wzrJVg0r9^iH>dGQ3;L@4oOsRx7{hqr!9uMb;~v#b zy7F4}=fMqH8-Y7a`ShQFrlx@DWpG({8}mSy*liJpzsP`Lc@1^6I=~I*9jB~uG&-X{ zY5AFs_TRMEUw^zv76Go9pf0;`E<;^Ekf}(RtLI5So!=PANDH2+JO<1~Vur8Z2Gy&< zLzuCAatd%-Y@`ToFCF331Q>CmP16SEFG9n`&o$7hBbj;C`a&?8&Avo;r@o=x~) z{`UyJXVPtxh=n!X2kGQPTV{x4)W-eW2pSCgFx4sw%X`d3R#CuNB&6wv`64O4nXL~; z5n=jSh5%}_Z_@KR3aB@#9!RzIA^p^NTQ=yGz zh$@JkK0I}J);rgjDr;LP+mbBX@)PrWws&ps6~0^e{*w!32XBkW@T&+xh3|Bhbe5Yw z{lB3cwC4(Fmym826{pD1d>3 zW?$3mL+KyEA+iX##QuJ=8W^SArz!X?N^Bir2WT>eD+Axjs)5g1q#UpPvO)V@8lk-i zfch6#*2itP3f&qGE3cd>Tc~PDR<)$cABgY!#JBD(?^W-7*}{gds_P@-{b!t?NgXIIj*>%)?tdq430yykhDQ2IBOV0(fi^BD5UIYM>6MRrZ;Lm1`F(SKfB)kXmk4 zR4qxkgByn>n~k3AWE4Q}&;ytP6w=d+rbcNSvjw0#*#h8xw=IDG%HZX}`I7mg^Oeap z?a7*LiQ;WZ$M$6jsh19$R!H7VqX7KmOd&P15C8h5A)@8~h^TBOYv7*eO@dZ_x`ULj z@D?RO5o#j^Y`~7wB6JqTqnEEg;Ee@uXnW>dhNBRE7Ny@Ba4^*>l|;67IhTG~qyVX0 zV-{awx}a;IFM60s(fkr-fgVYxqAdV!!mq1R14xZy5Bw~Io`xxipz|sqa#fGzr^mF@ zfFUlagQ5v~oc_@eDbpZY8;IhFE2+^`&k-FR9hy*Y2Xv-d+nQf!g0L%iw)JFmDAd$0 zH>roy>9BIsIrSjK?qHuEh0Ao_nvS2KMp8zhN(Bc}pwd!nX6iM>1_mPh_%)6is>dr- zg^x|`qH5%?A{jQC^ep0kndSqgwWN7qFDMvO`5u#U4ZnaiR^!H=GtFnYn5xw1oi3yL zDP~}q;2?mRw=Qn^ch37tBnUCG_Jr{8itvj06>(aaFi+$)NjWVjRr%jcFk0kQaY76T zaUm|o&Hd2yylf|K)}VGKGWdU=xjSn=5D7~NV|f>X?@=R6`KubF=H^^R!KCQX*he!P zy0i$M3fPs6CF7Qy$jz|pd6jki!oHomwCEUb${5ysT%(roKM}|w5($U{qOZ;GY=3+E z!lpgRO?%!yklJ)4={s_s8#rMWX)^h-a!am7E42sYkRbHRy_r_2<$0U&K2^FEslR{` z2xN<8lTi|AB?}uC%d4iJoqBe*Ia$7ron@Ta{89apMCp-)^T^Gjy037ayamN(T55vU z&Rn;6OP5B)8AA+$l`m1nho_9=+04*uyegw3+4Ra^QD=&g2TZrSd@?W{nhK@d4GDV# zM#x7(?+tgExTzkq;NGIaIGU9lL5>xPFY6DRgggC4~93GRj67bt`*)i8J7ny5L z%4AC`t-NMgrrVO$svdu&JK+f24IB}e>AZC4;-Oh(Zu9KfWbOJy@%p4=!?J`#RB~e` zX24IrIjJ34JAo9zbS;mdbzc=ToG<}q=V8$9g%k2)1a_`4Un%UI;5}=|CveQ?go*(P z;yLcZVld~)z+!oD)&J*~am?ogPAfeX0W)?inT5cZlI9g86n*ttANMl7l7cu&$_SrlM81 zN3F1@plbkrk;p)5#|}9Q8?)wUi727!1qa^mTAQ?&?4E_)vuCL}t9liqlip5ut3uuD zWtJ+&oN2R(Qzp!hN?+w`LBc zT&v^eTZOK8J5G0KE(b~XcKnTo8-;a?rR9^+nWK{(31|H+cX8ao5uz(E7qyF8v4;Z2 zPwl3svlMhv&_w}5kc^c&KtF3KV2%G7JyGyC)Xcxe1K~k8@ZhRKso_>>*>w9<`=ZMe z-@E8^T{tvxXwg$l$43^+yfejgMr5{hmh(fUm&5bVzcc>!`1|!gU;Dw@zj`9^_&5IQ z>E!O;NN#y5QU6r3>ghz;)3C}0yDM5;MN6XOa^DthWiZl4O-p6Og_YA&b)i(km@v8% zg2mlHuwT)?z#SA?!uv_R>%+f(5%EXY@^{haZ0w4&{>5Lyd)YLsMI2Q?0=HzvX?=UZ zc5eF!>^rHTUafHWdeMAsX$&uU z%_56l7}dfNR;Euz-YK{%$Q+R77g+TKf#_-iGra*EEnQiHuI8qpu@P>F(#q2KTJFlY z@hfE9*km}N(K+QYHoDa2-d@&%whZ>Vx0ewmL}2J1*ko#gX2wFJ&H5JLO~PQ&Poubv z_bm>NLBqqUJ21}WIrJe`ah{m5(y)d&c9HRr%XKqbKmY@NX*{^fw*68Q|-iX%kLGVouyl9^gmtuinoL8Cruop$MXkc8aqK!Pcsr{?_JnW0C2 z7G<6@v!mlwV$Ky~ggE((ii!Q^>_e)?@#B6o(=kg?O;nX(!x)p8j#+w9%Fr>J`SD_( zRUx)cp^@Ue@9*O&ZGR*<#!j?yR@lmMD-D41V+z($@LdXCLcoO1Y*ot)S8-QGd`FCX zvj&@JB>tj^hWk0>#&DZ0j?IfT4P?_ zXP=_+Si)ZO`5j3pu6g4?!o3=*LC0ndKhM`EoSR5B=-B*4q#QN8)Vf*tvAeTO{6KVe zy2TIN5}pkLr!RB$>2pdt_WRQ|Z0?|`gY|)!PuKyOkwv3s*xczetj?D~|LF3TeDlRA zA5r-)Xca%7Wycd{FPrG$bHZjP-^6eV=21X&NGhjpH7i>%YUU9Q9 z=jb$xZ##F0Kb7#nmrx6Jhn8%gJ}&q{V?uMX{2GFaSk7Y*IEVQF>e0$h3W`T`8>lST~bOAdR&y30WRw3;$-zt2sFuzXY#aWw#Hb^~9 zMmG{;GKz${RotQ~wPIt^UX9r(pxIcj`oWrcVeZg1TdH(d!nsSEjrDvsHm6FO=llt0 z+rK~y;8?HDMu|_j>gW{3KXG=5e<9%^OLu2Qt!()J3=dzX7SA`>Zz2y}P>*iIfnM~2 zfi^Lp$$LiH2Bfn<(WooWc_|bU$j_%rAE$Q~3g1)_0@RhOaoBYSckj+8OX3(ug1O^R zgr8^hA`1g}s)G{p!%zAv4%!%0BS;saWyq$A6W~liRg*nYSw0Qd)072}2@>7nQdsX{ z)3|7r zgw#Oi+sCHHz=aIXu1tD2;M5-?J386@mcz9y;rEi$D%H+HjECFYhPSp{-7?>PEi%6| zxo*!g#VvUp5-LciB9)k;!DrT`H?Ig3N1)Q5llqLoJ1^3xc$Y!>I<>HBVzm0e2;{AecAbp~x6oNue+L`IA(f>yn?4ubcugFOmowH)j*1-Z~?($xFkUS+b z@zZeFU_uy$PIk-#{R7N5??FhU4Dp^}E`FR2!KD0ud8#(!+ci{8zQ*(4CA0HhEfz#55DZsLS3 zqFJG9IyydNkzZdz_P1ChnuLs=@0O62XAZH>6zl^`R|pUC?aQP~BtgI1Tv#Vs&f_&B zT5!+3fE6JxI46Dyxu_qgAzxfi3OHCnC9^A2a0c^Iixv-3QY2qBueE8uYBWNHx|%^Q z=E}$zxtLE#=FJ)mL$G;}P#hgIU?ifqhV($}Y&R%#c&I6dh5CZGIq7YltC>HU^6tFu z*|{X)bT@pS7><&OZZE?ZKuoUkzw?xl2_H^>6C9i>-e7(kn*N`dc1T}FAL<0kOUU#k zLk&dFDD!(!g=T{){51x9ecr)ln3B=vs`oRtWU{HkT*`v-j2CAOIW71nGX@)G?fC|K z`h}?%X1C2-=1-)&9oIb_8G{{76*VU8jrShxl8xp+adb#OHFZc?0d z!!s4!k~LMe{v#(S8NB-hYS9dr9DDTd6aD zj|Za03PFukbA@Ta<$}5Pr2G(9mTp#+rFKuE+}D{%xtm=D||~#OuKuIs>k5@_r1m+ zCO444;N;TEAAveWD28lhcSto|1(@8>F{VUfZI3rZ< zuBwgna*Ajlw@N*XfyqM?>G+YpA@_;}pJ2>%2dJ~l0rU4QKQO;)F*I`%y7SOXhc%h* zN%Jw{ntTf`O?9}BJVYk3OMjo~(p1cFX(}4$o${GQ086WzS$AnF#>|G>Qo|-aACD6= z$1SjH7hl$0NJc?|@hhL<+=OL2UNSkeOG`Ilf#sKOYN5MH70-~}bGoXBe~U?T4X&@H zp0w#~7HTDmjoD3g;o*CxU+(~qVY#fKL=nEa#v*AO2U(G{I1(NKvHRap2|HQJiQV&D zjPVzU9dF89zB;j+VU?_!SiMS+iiYd+^THdOE^WKG?b6PRJLk4vD@)aMoL7ye+-dVb zfB`nHjuoli$0=Y~jrdXJ2?X@r4&qGUJKaVQ6aW;CEtT-uG366V^N*Cq$~(c@tvQgT zAxn#R!Oju!F40OO;mj`HD=yd1+pDwGhu=YR^a1{NsyF?3<9y&xw_fX=Qbp_H;wSE^nZ_TASDcrfH{1{WxcXYxhYdG2z|gjG@}YRwt=5fy>)kY0j1SR~ zYp(hqIInv*#l_d0pERz!a^&(6IJ-&}ci@Q4>VntA3xyMflZTV`dWi45)leoBvLm4% z*{go_S-DWTIYPVi16S?twH8L}W-Szb2S1HOx%)St*bTnp)IFlz^U+`$h#p6&^!>x` zv=qhH%6hovuc*-a#F1ZeFB42VP6p2g2H+MZiqCnh!IjOxG$(S?H|+Gkiy`2cmkgQQTOSn~mCgK=Zxd>z#=rHai!C&q}y zY)lDed(oDm1QWXzq7IcmMBsDrWif$gd|d`cKX8|({1g4cS0DI+d_bbF>FCmB!8%Z#Z zE)M26rvTSvtbj_@PPMjT0 z6h9ER-YgWPC`Y9jl%`q)|%e{btV?pVIjJPPtG9MUjb$Uo#s`RkT1& z< z!U$<64zEN9`uI0t`260Xv`oCco1XSjV92<0NOlG-D4;Xok^hYc;-zfhrAlyIoqc1Y z3Vc$L`@)Hd6JO2Op&Mp2$fF)+pr?nJ*w`fPGR;JYC);J3jbNN`R~a9A1ouS3Ws|gR zwt*6Dn`@vnI6<$)^AzgWII7gIap111GM%a?DtMm9=>%E;X-gMvR4f0sCqDrdr%Yt@%Pg;$j)Sq*oZ4ZlBYVZb zI-T$O4#f@#PCz{J07A$JOs3mrv&ph-7fcnu5FEb{JiibMej$|nLMX!X$3o4=LgmLo z!^cAHKMKts3oCDlmREMZwDV(2^T!r2&qbyZnt9yj>fc&(b{A1+g?KmQJ3zF4iqs>{88a{gu_1S1;iUyft&3Z|%Ff zZ+_D?>-@H4%g#F#w^U)5%8fMTIcb)Wru#_C zno1^*-4SrRbIi2eR596pN5JjQi>3$AH2lErPA|rz%QQK7N1*#1`$4pRvi+Y0y0g{x F{{U-NC^Y~8 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9452e2953c177f60a8fd3bc66ae8a3eb1811799f GIT binary patch literal 5496 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 BLDT>M literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..631dc964f10e73b85f9ec20f45539dc2ede6c7e8 GIT binary patch literal 58274 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 NhE(u@qky@L{~HW_QAPj& literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fda8dc096f72af418e64d21ef993dff7a4ee6ba GIT binary patch literal 2695 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%0AQV$h>r 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..502f18a331bfcaa0f8c77143b76e57dcf3e0dcdc GIT binary patch literal 18113 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85450b9b84b5d591dc240a60de798b884f66547e GIT binary patch literal 5371 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/_identifier.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/_identifier.py new file mode 100644 index 00000000..928c1503 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/async_utils.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/async_utils.py new file mode 100644 index 00000000..f0c14020 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/async_utils.py @@ -0,0 +1,99 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +if t.TYPE_CHECKING: + import typing_extensions as te + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True # type: ignore[attr-defined] + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return value + + +class _IteratorToAsyncIterator(t.Generic[V]): + def __init__(self, iterator: "t.Iterator[V]"): + self._iterator = iterator + + def __aiter__(self) -> "te.Self": + return self + + async def __anext__(self) -> V: + try: + return next(self._iterator) + except StopIteration as e: + raise StopAsyncIteration(e.value) from e + + +def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + return iterable.__aiter__() + else: + return _IteratorToAsyncIterator(iter(iterable)) + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/bccache.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/bccache.py new file mode 100644 index 00000000..ada8b099 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/bccache.py @@ -0,0 +1,408 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" + +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: ... + + def set( + self, key: str, value: bytes, timeout: t.Optional[int] = None + ) -> None: ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/compiler.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/compiler.py new file mode 100644 index 00000000..a4ff6a1b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/compiler.py @@ -0,0 +1,1998 @@ +"""Compiles nodes from the parser into Python code.""" + +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(new_func, f) # type: ignore[return-value] + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: # noqa E721 + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "te.Self": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "te.Self": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in ( + (self.filters, visitor.filters, "filters"), + ( + self.tests, + visitor.tests, + "tests", + ), + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(sorted(vars)): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, sorted(public_names))) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import async_exported + from .runtime import exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline("agen = parent_template.root_render_func(context)") + self.writeline("try:") + self.indent() + self.writeline("async for event in agen:") + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent() + self.writeline("finally: await agen.aclose()") + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") + self.writeline("try:") + self.indent() + self.writeline( + f"{self.choose_async()}for event in gen:", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + def loop_body() -> None: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.with_context: + self.writeline( + f"gen = template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)}))" + ) + self.writeline("try:") + self.indent() + self.writeline(f"{self.choose_async()}for event in gen:") + loop_body() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + loop_body() + else: + self.writeline("yield from template._get_default_module()._body_stream") + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") + message = ( + "the template {included_template.__name__!r}" + f" (imported on {position})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + + # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, + # it is only valid if it references a Namespace object. Emit a check for + # that for each ref here, before assignment code is emitted. This can't + # be done in visit_NSRef as the ref could be in the middle of a tuple. + seen_refs: t.Set[str] = set() + + for nsref in node.find_all(nodes.NSRef): + if nsref.name in seen_refs: + # Only emit the check for each reference once, in case the same + # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. + continue + + seen_refs.add(nsref.name) + ref = frame.symbols.ref(nsref.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. + # visit_Assign emits code to validate that each ref is to a Namespace + # object only. That can't be emitted here as the ref could be in the + # middle of a tuple assignment. + ref = frame.symbols.ref(node.name) + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/constants.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/constants.py new file mode 100644 index 00000000..41a1c23b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/debug.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/debug.py new file mode 100644 index 00000000..eeeeee78 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: t.Optional[Context] = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/defaults.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/defaults.py new file mode 100644 index 00000000..638cad3d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/environment.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/environment.py new file mode 100644 index 00000000..0fc6e5be --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/jinja2/environment.py @@ -0,0 +1,1672 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" + +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping[t.Any, t.Any]], +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: # noqa E721 + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: _env_bound) -> _env_bound: + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = missing, + ) -> "te.Self": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.5 + ``enable_async`` is applied correctly. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "

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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a6f8f1aa992470040704065f9deacb76834509a GIT binary patch literal 24730 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfdd1436ea3620c8c571fda7300d96f0733d63de GIT binary patch literal 14888 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 U=t|&j?@BP;^~w_}W90Dv0F05r_y7O^ literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d779838837ae20ab201b23284a04dfc64e31ec16 GIT binary patch literal 3121 zcmbVOO>7&-6`ox#DT<^-Ns$~^O_XucG+^SAk&OO;Xq&pS)iSo})MgK6P*B62A-VE$ zcQZRAML}sL!+;y~klx%w4^GiGc3q(9sqU%hEkG|)-N4S;1za>e_@-1n6z-vYGfUEx zprAzu;QYRQ^X7Z+eUE<_8%rQ)r;a_W|6~NAzsg0w!CJN5B@Lmgh$5=lsI0-L+j=un zj%bK!EAhVgqJ+}%siB47BgB9wOy0g4*^;PtC2<55o}ciG2gP810!dm#T_1nb5jZp zw+JkD4d||-F1n!=Z$QUmu=b@Se)M|o+dkudj$I^<-&nC6O6**rP&$)4bNs}7?v0kU z)+D}QJlAGUJ7-(foYxf%*EyD*UEV4w4dd6CqapEGUCyqK%oZk5=6*6RjO)S0N5 zEzZHriW!>C$Kc+SG(g(Bf$p9v?!x51Sk6a5gv$WrN$5i3xm2U{scu3Z^pq|Y_&6;0 zz#)$m96yK2RWypk0IU@qw)Qou35lC(D-yANjq1{!H+x^6N6#TK2ymfNMSf7zKZE$; zH??)-r-XdEYBX}QclWw>Nxy)o@uv1&t!sp1N9&-~$OY8VGEs5~E;y$g>|@bjxCbXz zVB;RBS&T~!%f}{haFyYf&nPB7Cb&boShxucjhH6$_vr{-g5By0GX<`3w~2|O8)CvC!fG?PKv|ZrwH!0Q>=EDZJ9`;ZX1bgRm-qEaAz`@= zwtS_?<5rV!%kE06Yb_hsT#g&e_8=;;-!dEWAwAX1Y`Dv~)39K-Y1JD79;=jCkP)0g zm{M#x*lZA|ZaH;q2_GaHq-}xDDv_wb#d}Z;5y&Q#nv#pXmftu?;wa8HnP}vfd)b%u zP1j?~!-)5kWV5&pw!;$%rHtnD`19G9L;ZP=aMHwK-sZ7Y!#)!dzU2~cfih`Xn9R6M z>=r=ozBng|RNh$Dzq6nh0x zUjR=8IR<$KU^+BTGP`0YB3R1%tXLLnVfyR89Vi@nsc3Beq5_B7AXU>S8((b1x z-fq9u{-O2LL+?KI&QsT`+ehYarx&*33;(>In*H&sTgeyxj&uZq142`c1ESdBVTI2^w|u$kv={Vxix+~8ToxO3e!D=BI!X9N);wo zk$^sI2hqujq@R6_YV`qutn_Q>kjy%|*`o;!b@fbS?Zww1JekZ$hjseV(9gd-ufur8~yLwz2Tuu@8(dhRh3+gC-rQfchFt{vV+FMIK<# zGWy!{=UCHi0}e7_gzI6OwHYvncFvuS}(H)1S0uZ@}hXb z?~x0vfP^JUGI|udfEe#cN>C!U>t2)so`O>)zl5|OT>XNh4vHmJjUiQKW#i952Xi^_ zIp~HHH<$r_cI`F;yaB;V?Z8Qd*Ghj%ytuLW zU?j2ey}RkDx4Un3x8jE%B-6?r8EpvyT-N5bNx`zG;ok@+_UlXV_k(?h%Y;(AmC>>w zCM{A+bx;IDr9e^rv&c*aG12v)W^n2KU{o|XBUG-XYlE@Uh1X727QcCN@l>JsjbJjA zt-!x9=18XZ16?p6JSdal6=BjrjB?v0RKXJ%RoAtH_*qYuKVqw_;xg(K2>W95QT)qI zm$q#7Rh|P8Ndx}RpxcRPnsyIO{TY4wLBzQ7%B5HC8PERBc=|7+<3D(EBL*y{N3P6n z&fY^spfx>p7ZnG4AELrFV+$3ozwxWJ8*8^R+qn~eM1`JM;p5nhHgV0^K`^{G`J35a z&)zC*&oAxD_3q2M_NCo~u08p2Vhp4v-<^GD_WB86*c}AxTi^O!`M2fwjqR_T`G;I9 G=llnkDDW%* literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cfdf2b830b2234ff378f0b9f0bd2dbcbb1b7763 GIT binary patch literal 21513 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 F|6kc6W!nG% literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..497b8afacb988f4804111a9ee85d57b799c3f7fb GIT binary patch literal 22910 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..251028ca10d04fa4d86863fe2a7ded808bd520dd GIT binary patch literal 49472 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%0DA^a&fPvyIzfxbGj;eVlbLN$XR?erjHn|h&RO!A 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 OM`hAp^@@e@jsFkvMcH!z literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec34651f3aa960e9a3d9782c85b44e56b6347dbb GIT binary patch literal 26379 zcmc(He^4A(erNam{sjXJzl4xz{Xj4X2FsFdnU&=rBqU@R$p+anvIC>(1_li?qn-DpFDpm8wc5Mf#i>dz_TE;qxl3KZXis<+rR2K3y4rs(qeZFs zls|Hx?|a=n0~%SIq^_6} zo&byc5ijj2W$~g|*>HJJxhN>Mp^!1e>{~5o#9!@0>I|}6rLx%XlXqc^4RS!P!J7zmK7x9de`mxV)FuvbEnK??d_?`MCT9`t~GJpVGg$a zID?(10Xr=w?CeD?&≷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 Jq%el`{{p2Lq%r^i literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_compat.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_compat.py new file mode 100644 index 00000000..9153d150 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_compat.py @@ -0,0 +1,623 @@ +import codecs +import io +import os +import re +import sys +import typing as t +from weakref import WeakKeyDictionary + +CYGWIN = sys.platform.startswith("cygwin") +WIN = sys.platform.startswith("win") +auto_wrap_for_ansi: t.Optional[t.Callable[[t.TextIO], t.TextIO]] = None +_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") + + +def _make_text_stream( + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO[t.Any]) -> str: + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write("") # type: ignore + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + +def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + +def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + is_binary: t.Callable[[t.IO[t.Any], bool], bool], + find_binary: t.Callable[[t.IO[t.Any]], t.Optional[t.BinaryIO]], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + +def get_binary_stdout() -> t.BinaryIO: + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdout.") + return writer + + +def get_binary_stderr() -> t.BinaryIO: + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stderr.") + return writer + + +def get_text_stdin( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: t.Union[str, "os.PathLike[str]", int], + mode: str, + encoding: t.Optional[str], + errors: t.Optional[str], +) -> t.IO[t.Any]: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: "t.Union[str, os.PathLike[str]]", + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, +) -> t.Tuple[t.IO[t.Any], bool]: + binary = "b" in mode + filename = os.fspath(filename) + + # Standard streams first. These are simple because they ignore the + # atomic flag. Use fsdecode to handle Path("-"). + if os.fsdecode(filename) == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm: t.Optional[int] = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO[t.Any], af), True + + +class _AtomicFile: + def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> "_AtomicFile": + return self + + def __exit__(self, exc_type: t.Optional[t.Type[BaseException]], *_: t.Any) -> None: + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi( + stream: t.TextIO, color: t.Optional[bool] = None + ) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] + ) -> t.Optional[t.TextIO]: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO[t.Any]) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.Optional[t.TextIO]], + wrapper_func: t.Callable[[], t.TextIO], +) -> t.Callable[[], t.Optional[t.TextIO]]: + cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.Optional[t.TextIO]: + stream = src_func() + + if stream is None: + return None + + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: t.Mapping[ + str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] +] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_termui_impl.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_termui_impl.py new file mode 100644 index 00000000..ad9f8f6c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_termui_impl.py @@ -0,0 +1,788 @@ +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" + +import contextlib +import math +import os +import sys +import time +import typing as t +from gettext import gettext as _ +from io import StringIO +from shutil import which +from types import TracebackType + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: t.Optional[t.Iterable[V]], + length: t.Optional[int] = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + label: t.Optional[str] = None, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label: str = label or "" + + if file is None: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + file = StringIO() + + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width: int = width + self.autowidth: bool = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast(t.Iterable[V], range(length)) + self.iter: t.Iterable[V] = iter(iterable) + self.length = length + self.pos = 0 + self.avg: t.List[float] = [] + self.last_eta: float + self.start: float + self.start = self.last_eta = time.time() + self.eta_known: bool = False + self.finished: bool = False + self.max_width: t.Optional[int] = None + self.entered: bool = False + self.current_item: t.Optional[V] = None + self.is_hidden: bool = not isatty(self.file) + self._last_line: t.Optional[str] = None + + def __enter__(self) -> "ProgressBar[V]": + self.entered = True + self.render_progress() + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.render_finish() + + def __iter__(self) -> t.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.is_hidden: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + import shutil + + if self.is_hidden: + # Only output the label as it changes if the output is not a + # TTY. Use file=stderr if you expect to be piping stdout. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) # type: ignore + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> t.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if self.is_hidden: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if stdout is None: + stdout = StringIO() + + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get("PAGER", None) or "").strip() + if pager_cmd: + if WIN: + if _tempfilepager(generator, pager_cmd, color): + return + elif _pipepager(generator, pager_cmd, color): + return + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if (WIN or sys.platform.startswith("os2")) and _tempfilepager( + generator, "more", color + ): + return + if _pipepager(generator, "less", color): + return + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if _pipepager(generator, "more", color): + return + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> bool: + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + + Returns True if the command was found, False otherwise and thus another + pager should be attempted. + """ + cmd_absolute = which(cmd) + if cmd_absolute is None: + return False + + import subprocess + + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit("/", 1)[-1].split() + if color is None and cmd_detail[0] == "less": + less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen( + [cmd_absolute], + shell=True, + stdin=subprocess.PIPE, + env=env, + errors="replace", + text=True, + ) + assert c.stdin is not None + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text) + except (OSError, KeyboardInterrupt): + pass + else: + c.stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + return True + + +def _tempfilepager( + generator: t.Iterable[str], + cmd: str, + color: t.Optional[bool], +) -> bool: + """Page through text by invoking a program on a temporary file. + + Returns True if the command was found, False otherwise and thus another + pager should be attempted. + """ + # Which is necessary for Windows, it is also recommended in the Popen docs. + cmd_absolute = which(cmd) + if cmd_absolute is None: + return False + + import subprocess + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + subprocess.call([cmd_absolute, filename]) + except OSError: + # Command not found + pass + finally: + os.close(fd) + os.unlink(filename) + + return True + + +def _nullpager( + stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + for editor in "sensible-editor", "vim", "nano": + if which(editor) is not None: + return editor + return "vi" + + def edit_file(self, filename: str) -> None: + import subprocess + + editor = self.get_editor() + environ: t.Optional[t.Dict[str, str]] = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + try: + c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: + import tempfile + + if not text: + data = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = unquote(url[7:]) + + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = ["explorer", f"/select,{url}"] + else: + args = ["start"] + if wait: + args.append("/WAIT") + args.append("") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = ["cygstart", os.path.dirname(url)] + else: + args = ["cygstart"] + if wait: + args.append("-w") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + func: t.Callable[[], str] + + if echo: + func = msvcrt.getwche # type: ignore + else: + func = msvcrt.getwch # type: ignore + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + +else: + import termios + import tty + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + f: t.Optional[t.TextIO] + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_textwrap.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_textwrap.py new file mode 100644 index 00000000..b47dcbd4 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_textwrap.py @@ -0,0 +1,49 @@ +import textwrap +import typing as t +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: t.List[str], + cur_line: t.List[str], + cur_len: int, + width: int, + ) -> None: + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent: str) -> t.Iterator[None]: + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_winconsole.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_winconsole.py new file mode 100644 index 00000000..6b20df31 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/_winconsole.py @@ -0,0 +1,279 @@ +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prompt. +import io +import sys +import time +import typing as t +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(Structure): + _fields_ = [ + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle): + self.handle = handle + + def isatty(self): + super().isatty() + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError(f"Windows error: {GetLastError()}") + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return f"Windows error {errno}" + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self): + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> t.Optional[t.TextIO]: + if ( + get_buffer is not None + and encoding in {"utf-16-le", None} + and errors in {"strict", None} + and _is_console(f) + ): + func = _stream_factories.get(f.fileno()) + if func is not None: + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/core.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/core.py new file mode 100644 index 00000000..e6305011 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/core.py @@ -0,0 +1,3047 @@ +import enum +import errno +import inspect +import os +import sys +import typing as t +from collections import abc +from contextlib import contextmanager +from contextlib import ExitStack +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat +from types import TracebackType + +from . import types +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _flag_needs_value +from .parser import OptionParser +from .parser import split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .decorators import HelpOption + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: "Context", incomplete: str +) -> t.Iterator[t.Tuple[str, "Command"]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(MultiCommand, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_multicommand( + base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False +) -> None: + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = ( + "It is not possible to add multi commands as children to" + " another multi command that is in chain mode." + ) + else: + hint = ( + "Found a multi command as subcommand to a multi command" + " that is in chain mode. This is not supported." + ) + raise RuntimeError( + f"{hint}. Command {base_command.name!r} is set to chain and" + f" {cmd_name!r} was added as a subcommand but it in itself is a" + f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" + f" within a chained {type(base_command).__name__} named" + f" {base_command.name!r})." + ) + + +def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size))) + + +@contextmanager +def augment_usage_errors( + ctx: "Context", param: t.Optional["Parameter"] = None +) -> t.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing( + invocation_order: t.Sequence["Parameter"], + declaration_order: t.Sequence["Parameter"], +) -> t.List["Parameter"]: + """Returns all declared parameters in the order they should be processed. + + The declared parameters are re-shuffled depending on the order in which + they were invoked, as well as the eagerness of each parameters. + + The invocation order takes precedence over the declaration order. I.e. the + order in which the user provided them to the CLI is respected. + + This behavior and its effect on callback evaluation is detailed at: + https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order + """ + + def sort_key(item: "Parameter") -> t.Tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show the default value for commands. If this + value is not set, it defaults to the value from the parent + context. ``Command.show_default`` overrides this default for the + specific command. + + .. versionchanged:: 8.1 + The ``show_default`` parameter is overridden by + ``Command.show_default``, instead of the other way around. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: t.Type["HelpFormatter"] = HelpFormatter + + def __init__( + self, + command: "Command", + parent: t.Optional["Context"] = None, + info_name: t.Optional[str] = None, + obj: t.Optional[t.Any] = None, + auto_envvar_prefix: t.Optional[str] = None, + default_map: t.Optional[t.MutableMapping[str, t.Any]] = None, + terminal_width: t.Optional[int] = None, + max_content_width: t.Optional[int] = None, + resilient_parsing: bool = False, + allow_extra_args: t.Optional[bool] = None, + allow_interspersed_args: t.Optional[bool] = None, + ignore_unknown_options: t.Optional[bool] = None, + help_option_names: t.Optional[t.List[str]] = None, + token_normalize_func: t.Optional[t.Callable[[str], str]] = None, + color: t.Optional[bool] = None, + show_default: t.Optional[bool] = None, + ) -> None: + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: t.Dict[str, t.Any] = {} + #: the leftover arguments. + self.args: t.List[str] = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args: t.List[str] = [] + #: the collected prefixes of the command's options. + self._opt_prefixes: t.Set[str] = set(parent._opt_prefixes) if parent else set() + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: t.Optional[t.MutableMapping[str, t.Any]] = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`result_callback`. + self.invoked_subcommand: t.Optional[str] = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + + #: The width of the terminal (None is autodetection). + self.terminal_width: t.Optional[int] = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width: t.Optional[int] = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args: bool = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options: bool = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names: t.List[str] = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func: t.Optional[t.Callable[[str], str]] = ( + token_normalize_func + ) + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color: t.Optional[bool] = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: t.Optional[bool] = show_default + + self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: t.Dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> "Context": + self._depth += 1 + push_context(self) + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self) -> t.Dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: t.ContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._exit_stack.close() + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + @property + def command_path(self) -> str: + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> "Context": + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: + """Finds the closest object of a given type.""" + node: t.Optional[Context] = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: t.Type[V]) -> V: + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: ... + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[False]" = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... + + def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name) + + if call and callable(value): + return value() + + return value + + return None + + def fail(self, message: str) -> "te.NoReturn": + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self) -> "te.NoReturn": + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> "te.NoReturn": + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: "Command") -> "Context": + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + @t.overload + def invoke( + __self, + __callback: "t.Callable[..., V]", + *args: t.Any, + **kwargs: t.Any, + ) -> V: ... + + @t.overload + def invoke( + __self, + __callback: "Command", + *args: t.Any, + **kwargs: t.Any, + ) -> t.Any: ... + + def invoke( + __self, + __callback: t.Union["Command", "t.Callable[..., V]"], + *args: t.Any, + **kwargs: t.Any, + ) -> t.Union[t.Any, V]: + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + """ + if isinstance(__callback, Command): + other_cmd = __callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + __callback = t.cast("t.Callable[..., V]", other_cmd.callback) + + ctx = __self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, param.get_default(ctx) + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = __self + + with augment_usage_errors(__self): + with ctx: + return __callback(*args, **kwargs) + + def forward(__self, __cmd: "Command", *args: t.Any, **kwargs: t.Any) -> t.Any: + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + if not isinstance(__cmd, Command): + raise TypeError("Callback is not a command.") + + for param in __self.params: + if param not in kwargs: + kwargs[param] = __self.params[param] + + return __self.invoke(__cmd, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class BaseCommand: + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + + #: The context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: t.Type[Context] = Context + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + ) -> None: + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + + if context_settings is None: + context_settings = {} + + #: an optional dictionary with defaults passed to the context. + self.context_settings: t.MutableMapping[str, t.Any] = context_settings + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire structure + below this command. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + :param ctx: A :class:`Context` representing this command. + + .. versionadded:: 8.0 + """ + return {"name": self.name} + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get usage") + + def get_help(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get help") + + def make_context( + self, + info_name: t.Optional[str], + args: t.List[str], + parent: t.Optional[Context] = None, + **extra: t.Any, + ) -> Context: + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it's + the name of the command. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class( + self, # type: ignore[arg-type] + info_name=info_name, + parent=parent, + **extra, + ) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError("Base commands do not know how to parse arguments.") + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError("Base commands are not invocable by default") + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. Other + command classes will return more completions. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List[CompletionItem] = [] + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx.protected_args + ) + + return results + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: "te.Literal[True]" = True, + **extra: t.Any, + ) -> "te.NoReturn": ... + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: ... + + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt) as e: + echo(file=sys.stderr) + raise Abort() from e + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: t.Optional[str] = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + + .. versionchanged:: 8.2.0 + Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). + """ + if complete_var is None: + complete_name = prog_name.replace("-", "_").replace(".", "_") + complete_var = f"_{complete_name}_COMPLETE".upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + + .. versionchanged:: 8.1 + ``help``, ``epilog``, and ``short_help`` are stored unprocessed, + all formatting is done when outputting help text, not at init, + and is done even if not using the ``@command`` decorator. + + .. versionchanged:: 8.0 + Added a ``repr`` showing the command name. + + .. versionchanged:: 7.1 + Added the ``no_args_is_help`` parameter. + + .. versionchanged:: 2.0 + Added the ``context_settings`` parameter. + """ + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + callback: t.Optional[t.Callable[..., t.Any]] = None, + params: t.Optional[t.List["Parameter"]] = None, + help: t.Optional[str] = None, + epilog: t.Optional[str] = None, + short_help: t.Optional[str] = None, + options_metavar: t.Optional[str] = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool = False, + ) -> None: + super().__init__(name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params: t.List[Parameter] = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self._help_option: t.Optional[HelpOption] = None + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + info_dict.update( + params=[param.to_info_dict() for param in self.get_params(ctx)], + help=self.help, + epilog=self.epilog, + short_help=self.short_help, + hidden=self.hidden, + deprecated=self.deprecated, + ) + return info_dict + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> t.List["Parameter"]: + rv = self.params + help_option = self.get_help_option(ctx) + + if help_option is not None: + rv = [*rv, help_option] + + return rv + + def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> t.List[str]: + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return list(all_names) + + def get_help_option(self, ctx: Context) -> t.Optional["Option"]: + """Returns the help option object. + + Unless ``add_help_option`` is ``False``. + + .. versionchanged:: 8.1.8 + The help option is now cached to avoid creating it multiple times. + """ + help_options = self.get_help_option_names(ctx) + + if not help_options or not self.add_help_option: + return None + + # Cache the help option object in private _help_option attribute to + # avoid creating it multiple times. Not doing this will break the + # callback odering by iter_params_for_processing(), which relies on + # object comparison. + if self._help_option is None: + # Avoid circular import. + from .decorators import HelpOption + + self._help_option = HelpOption(help_options) + + return self._help_option + + def make_parser(self, ctx: Context) -> OptionParser: + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + if self.short_help: + text = inspect.cleandoc(self.short_help) + elif self.help: + text = make_default_short_help(self.help, limit) + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + if self.help is not None: + # truncate the help text to the first form feed + text = inspect.cleandoc(self.help).partition("\f")[0] + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section(_("Options")): + formatter.write_dl(opts) + + def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + epilog = inspect.cleandoc(self.epilog) + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(epilog) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + ctx._opt_prefixes.update(parser._opt_prefixes) + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + message = _( + "DeprecationWarning: The command {name!r} is deprecated." + ).format(name=self.name) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List[CompletionItem] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: The result callback to attach to this multi + command. This can be set or changed later with the + :meth:`result_callback` decorator. + :param attrs: Other command arguments described in :class:`Command`. + """ + + allow_extra_args = True + allow_interspersed_args = False + + def __init__( + self, + name: t.Optional[str] = None, + invoke_without_command: bool = False, + no_args_is_help: t.Optional[bool] = None, + subcommand_metavar: t.Optional[str] = None, + chain: bool = False, + result_callback: t.Optional[t.Callable[..., t.Any]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + + if subcommand_metavar is None: + if chain: + subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` decorator. + self._result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "Multi commands in chain mode cannot have" + " optional arguments." + ) + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(__value, *args, **kwargs): # type: ignore + inner = old_callback(__value, *args, **kwargs) + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv # type: ignore[return-value] + + return decorator + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = super().parse_args(ctx, args) + + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx.protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with the group return value for regular + # groups, or an empty list for chained groups. + with ctx: + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) + ctx.fail(_("Missing command.")) + + # Fetch args back out + args = [*ctx.protected_args, *ctx.args] + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + super().invoke(ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command( + self, ctx: Context, args: t.List[str] + ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError + + def list_commands(self, ctx: Context) -> t.List[str]: + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is + the most common way to implement nesting in Click. + + :param name: The name of the group command. + :param commands: A dict mapping names to :class:`Command` objects. + Can also be a list of :class:`Command`, which will use + :attr:`Command.name` to create the dict. + :param attrs: Other command arguments described in + :class:`MultiCommand`, :class:`Command`, and + :class:`BaseCommand`. + + .. versionchanged:: 8.0 + The ``commands`` argument can be a list of command objects. + """ + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: t.Optional[t.Type[Command]] = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: t.Optional[str] = None, + commands: t.Optional[ + t.Union[t.MutableMapping[str, Command], t.Sequence[Command]] + ] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: t.MutableMapping[str, Command] = commands + + def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + @t.overload + def command(self, __func: t.Callable[..., t.Any]) -> Command: ... + + @t.overload + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], Command], Command]: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'command(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.command_class and kwargs.get("cls") is None: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd: Command = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + @t.overload + def group(self, __func: t.Callable[..., t.Any]) -> "Group": ... + + @t.overload + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: ... + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], "Group"], "Group"]: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'group(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.group_class is not None and kwargs.get("cls") is None: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> "Group": + cmd: Group = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> t.List[str]: + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + + See :class:`MultiCommand` and :class:`Command` for the description of + ``name`` and ``attrs``. + """ + + def __init__( + self, + name: t.Optional[str] = None, + sources: t.Optional[t.List[MultiCommand]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + #: The list of registered multi commands. + self.sources: t.List[MultiCommand] = sources or [] + + def add_source(self, multi_cmd: MultiCommand) -> None: + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + + return rv + + return None + + def list_commands(self, ctx: Context) -> t.List[str]: + rv: t.Set[str] = set() + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> t.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The latter is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: A function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). If ``nargs=-1``, all remaining + parameters are collected. + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + :param shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + required: bool = False, + default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, + callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, + nargs: t.Optional[int] = None, + multiple: bool = False, + metavar: t.Optional[str] = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, + shell_complete: t.Optional[ + t.Callable[ + [Context, "Parameter", str], + t.Union[t.List["CompletionItem"], t.List[str]], + ] + ] = None, + ) -> None: + self.name: t.Optional[str] + self.opts: t.List[str] + self.secondary_opts: t.List[str] + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type: types.ParamType = types.convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = multiple + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self._custom_shell_complete = shell_complete + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + # Skip no default or callable default. + check_default = default if not callable(default) else None + + if check_default is not None: + if multiple: + try: + # Only check the first value against nargs. + check_default = next(_check_iter(check_default), None) + except TypeError: + raise ValueError( + "'default' must be a list when 'multiple' is true." + ) from None + + # Can be None for multiple with empty default. + if nargs != 1 and check_default is not None: + try: + _check_iter(check_default) + except TypeError: + if multiple: + message = ( + "'default' must be a list of lists when 'multiple' is" + " true and 'nargs' != 1." + ) + else: + message = "'default' must be a list when 'nargs' != 1." + + raise ValueError(message) from None + + if nargs > 1 and len(check_default) != nargs: + subject = "item length" if multiple else "length" + raise ValueError( + f"'default' {subject} must match nargs={nargs}." + ) + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + "default": self.default, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + + metavar = self.type.get_metavar(self) + + if metavar is None: + metavar = self.type.name.upper() + + if self.nargs != 1: + metavar += "..." + + return metavar + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is None: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, t.Any] + ) -> t.Tuple[t.Any, ParameterSource]: + value = opts.get(self.name) # type: ignore + source = ParameterSource.COMMANDLINE + + if value is None: + value = self.value_from_envvar(ctx) + source = ParameterSource.ENVIRONMENT + + if value is None: + value = ctx.lookup_default(self.name) # type: ignore + source = ParameterSource.DEFAULT_MAP + + if value is None: + value = self.get_default(ctx) + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the option's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value is None: + return () if self.multiple or self.nargs == -1 else None + + def check_iter(value: t.Any) -> t.Iterator[t.Any]: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + if self.nargs == 1 or self.type.is_composite: + + def convert(value: t.Any) -> t.Any: + return self.type(value, param=self, ctx=ctx) + + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + if value is None: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + value = self.callback(ctx, self, value) + + return value + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + if self.envvar is None: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + + return rv + + def handle_parse_result( + self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] + ) -> t.Tuple[t.Any, t.List[str]]: + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + ctx.set_parameter_source(self.name, source) # type: ignore + + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + + value = None + + if self.expose_value: + ctx.params[self.name] = value # type: ignore + + return value, args + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + pass + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast(t.List["CompletionItem"], results) + + return self.type.shell_complete(ctx, self, incomplete) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: Show the default value for this option in its + help text. Values are not shown by default, unless + :attr:`Context.show_default` is ``True``. If this value is a + string, it shows that string in parentheses instead of the + actual value. This is particularly useful for dynamic options. + For single option boolean flags, the default remains hidden if + its value is ``False``. + :param show_envvar: Controls if an environment variable should be + shown on the help page. Normally, environment variables are not + shown. + :param prompt: If set to ``True`` or a non empty string then the + user will be prompted for input. If set to ``True`` the prompt + will be the option name capitalized. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: If this is ``True`` then the input on the prompt + will be hidden from the user. This is useful for password input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + :param attrs: Other command arguments described in :class:`Parameter`. + + .. versionchanged:: 8.1.0 + Help text indentation is cleaned here instead of only in the + ``@option`` decorator. + + .. versionchanged:: 8.1.0 + The ``show_default`` parameter overrides + ``Context.show_default``. + + .. versionchanged:: 8.1.0 + The default of a single option boolean flag is not shown if the + default value is ``False``. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + show_default: t.Union[bool, str, None] = None, + prompt: t.Union[bool, str] = False, + confirmation_prompt: t.Union[bool, str] = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: t.Optional[bool] = None, + flag_value: t.Optional[t.Any] = None, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + help: t.Optional[str] = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + **attrs: t.Any, + ) -> None: + if help: + help = inspect.cleandoc(help) + + default_is_missing = "default" not in attrs + super().__init__(param_decls, type=type, multiple=multiple, **attrs) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # If prompt is enabled but not required, then the option can be + # used as a flag to indicate using prompt or flag_value. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + if is_flag is None: + if flag_value is not None: + # Implicitly a flag because flag_value was set. + is_flag = True + elif self._flag_needs_value: + # Not a flag, but when used as a flag it shows a prompt. + is_flag = False + else: + # Implicitly a flag because flag options were given. + is_flag = bool(self.secondary_opts) + elif is_flag is False and not self._flag_needs_value: + # Not a flag, and prompt is not enabled, can be used as a + # flag if flag_value is set. + self._flag_needs_value = flag_value is not None + + self.default: t.Union[t.Any, t.Callable[[], t.Any]] + + if is_flag and default_is_missing and not self.required: + if multiple: + self.default = () + else: + self.default = False + + if flag_value is None: + flag_value = not self.default + + self.type: types.ParamType + if is_flag and type is None: + # Re-guess the type from the flag value instead of the + # default. + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = is_flag + self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) + self.flag_value: t.Any = flag_value + + # Counting + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("'prompt' is not valid for non-boolean flag.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + flag_value=self.flag_value, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError( + f"Could not determine name for option with declarations {decls!r}" + ) + + if not opts and not secondary_opts: + raise TypeError( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: t.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar()}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + extra = [] + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + var_str = ( + envvar + if isinstance(envvar, str) + else ", ".join(str(d) for d in envvar) + ) + extra.append(_("env var: {var}").format(var=var_str)) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default = False + show_default_is_str = False + + if self.show_default is not None: + if isinstance(self.show_default, str): + show_default_is_str = show_default = True + else: + show_default = self.show_default + elif ctx.show_default is not None: + show_default = ctx.show_default + + if show_default_is_str or (show_default and (default_value is not None)): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif inspect.isfunction(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = split_opt( + (self.opts if default_value else self.secondary_opts)[0] + )[1] + elif self.is_bool_flag and not self.secondary_opts and not default_value: + default_string = "" + elif default_value == "": + default_string = '""' + else: + default_string = str(default_value) + + if default_string: + extra.append(_("default: {default}").format(default=default_string)) + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra.append(range_str) + + if self.required: + extra.append(_("required")) + + if extra: + extra_str = "; ".join(extra) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + # If we're a non boolean flag our default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return t.cast(Option, param).flag_value + + return None + + return super().get_default(ctx, call=call) + + def prompt_for_value(self, ctx: Context) -> t.Any: + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt( + self.prompt, + default=default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + ) + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is None: + return None + + value_depth = (self.nargs != 1) + bool(self.multiple) + + if value_depth > 0: + rv = self.type.split_envvar_value(rv) + + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + + return rv + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, "Parameter"] + ) -> t.Tuple[t.Any, ParameterSource]: + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option can be + # given as a flag without a value. This is different from None + # to distinguish from the flag not being given at all. + if value is _flag_needs_value: + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + elif ( + self.multiple + and value is not None + and any(v is _flag_needs_value for v in value) + ): + value = [self.flag_value if v is _flag_needs_value else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt if + # prompting is enabled. + elif ( + source in {None, ParameterSource.DEFAULT} + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the constructor of :class:`Parameter`. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: t.Sequence[str], + required: t.Optional[bool] = None, + **attrs: t.Any, + ) -> None: + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + if __debug__: + if self.default is not None and self.nargs == -1: + raise TypeError("'default' is not supported for nargs=-1.") + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() # type: ignore + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Argument is marked as exposed, but does not have a name.") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [self.make_metavar()] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar()}'" + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/decorators.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/decorators.py new file mode 100644 index 00000000..bcf8906e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/decorators.py @@ -0,0 +1,562 @@ +import inspect +import types +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") +T = t.TypeVar("T") +_AnyCallable = t.Callable[..., t.Any] +FC = t.TypeVar("FC", bound=t.Union[_AnyCallable, Command]) + + +def pass_context(f: "t.Callable[te.Concatenate[Context, P], R]") -> "t.Callable[P, R]": + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator( + object_type: t.Type[T], ensure: bool = False +) -> t.Callable[["t.Callable[te.Concatenate[T, P], R]"], "t.Callable[P, R]"]: + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f: "t.Callable[te.Concatenate[T, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + ctx = get_current_context() + + obj: t.Optional[T] + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator + + +def pass_meta_key( + key: str, *, doc_description: t.Optional[str] = None +) -> "t.Callable[[t.Callable[te.Concatenate[t.Any, P], R]], t.Callable[P, R]]": + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator + + +CmdType = t.TypeVar("CmdType", bound=Command) + + +# variant: no call, directly as decorator for a function. +@t.overload +def command(name: _AnyCallable) -> Command: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) +@t.overload +def command( + name: t.Optional[str], + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) +@t.overload +def command( + name: None = None, + *, + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def command( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Command]: ... + + +def command( + name: t.Union[t.Optional[str], _AnyCallable] = None, + cls: t.Optional[t.Type[CmdType]] = None, + **attrs: t.Any, +) -> t.Union[Command, t.Callable[[_AnyCallable], t.Union[Command, CmdType]]]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function with + underscores replaced by dashes. If you want to change that, you can + pass the intended name as the first argument. + + All keyword arguments are forwarded to the underlying command class. + For the ``params`` argument, any decorated params are appended to + the end of the list. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.1 + The ``params`` argument can be used. Decorated params are + appended to the end of the list. + """ + + func: t.Optional[t.Callable[[_AnyCallable], t.Any]] = None + + if callable(name): + func = name + name = None + assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." + assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." + + if cls is None: + cls = t.cast(t.Type[CmdType], Command) + + def decorator(f: _AnyCallable) -> CmdType: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + attr_params = attrs.pop("params", None) + params = attr_params if attr_params is not None else [] + + try: + decorator_params = f.__click_params__ # type: ignore + except AttributeError: + pass + else: + del f.__click_params__ # type: ignore + params.extend(reversed(decorator_params)) + + if attrs.get("help") is None: + attrs["help"] = f.__doc__ + + if t.TYPE_CHECKING: + assert cls is not None + assert not callable(name) + + cmd = cls( + name=name or f.__name__.lower().replace("_", "-"), + callback=f, + params=params, + **attrs, + ) + cmd.__doc__ = f.__doc__ + return cmd + + if func is not None: + return decorator(func) + + return decorator + + +GrpType = t.TypeVar("GrpType", bound=Group) + + +# variant: no call, directly as decorator for a function. +@t.overload +def group(name: _AnyCallable) -> Group: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) +@t.overload +def group( + name: t.Optional[str], + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) +@t.overload +def group( + name: None = None, + *, + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def group( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Group]: ... + + +def group( + name: t.Union[str, _AnyCallable, None] = None, + cls: t.Optional[t.Type[GrpType]] = None, + **attrs: t.Any, +) -> t.Union[Group, t.Callable[[_AnyCallable], t.Union[Group, GrpType]]]: + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + """ + if cls is None: + cls = t.cast(t.Type[GrpType], Group) + + if callable(name): + return command(cls=cls, **attrs)(name) + + return command(name, cls, **attrs) + + +def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument( + *param_decls: str, cls: t.Optional[t.Type[Argument]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default argument class, refer to :class:`Argument` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Argument + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def option( + *param_decls: str, cls: t.Optional[t.Type[Option]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default option class, refer to :class:`Option` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Option + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: t.Optional[str] = None, + *param_decls: str, + package_name: t.Optional[str] = None, + prog_name: t.Optional[str] = None, + message: t.Optional[str] = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. On Python < 3.8, the ``importlib_metadata`` + backport must be installed. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + metadata: t.Optional[types.ModuleType] + + try: + from importlib import metadata + except ImportError: + # Python < 3.8 + import importlib_metadata as metadata # type: ignore + + try: + version = metadata.version(package_name) # type: ignore + except metadata.PackageNotFoundError: # type: ignore + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + message % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +class HelpOption(Option): + """Pre-configured ``--help`` option which immediately prints the help page + and exits the program. + """ + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + **kwargs: t.Any, + ) -> None: + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs.setdefault("callback", self.show_help) + + super().__init__(param_decls, **kwargs) + + @staticmethod + def show_help(ctx: Context, param: Parameter, value: bool) -> None: + """Callback that print the help page on ```` and exits.""" + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Decorator for the pre-configured ``--help`` option defined above. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + kwargs.setdefault("cls", HelpOption) + return option(*param_decls, **kwargs) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/exceptions.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/exceptions.py new file mode 100644 index 00000000..0b831516 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/exceptions.py @@ -0,0 +1,296 @@ +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .globals import resolve_color_default +from .utils import echo +from .utils import format_filename + +if t.TYPE_CHECKING: + from .core import Command + from .core import Context + from .core import Parameter + + +def _join_param_hints( + param_hint: t.Optional[t.Union[t.Sequence[str], str]], +) -> t.Optional[str]: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + # The context will be removed by the time we print the message, so cache + # the color settings here to be used later on (in `show`) + self.show_color: t.Optional[bool] = resolve_color_default() + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=self.show_color, + ) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd: t.Optional[Command] = self.ctx.command if self.ctx else None + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=color, + ) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__( + self, + message: str, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=self.message + ) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, + message: t.Optional[str] = None, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + param_type: t.Optional[str] = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: t.Optional[str] = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: t.Optional[str] = None, + possibilities: t.Optional[t.Sequence[str]] = None, + ctx: t.Optional["Context"] = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: t.Optional["Context"] = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename: str = format_filename(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code: int = code diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/formatting.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/formatting.py new file mode 100644 index 00000000..ddd2a2f8 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +import typing as t +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: t.Optional[int] = None + + +def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: + widths: t.Dict[int, int] = {} + + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows( + rows: t.Iterable[t.Tuple[str, str]], col_count: int +) -> t.Iterator[t.Tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p: t.List[t.Tuple[int, bool, str]] = [] + buf: t.List[str] = [] + indent = None + + def _flush_par() -> None: + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter: + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__( + self, + indent_increment: int = 2, + width: t.Optional[int] = None, + max_width: t.Optional[int] = None, + ) -> None: + import shutil + + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer: t.List[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage( + self, prog: str, args: str = "", prefix: t.Optional[str] = None + ) -> None: + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: The prefix for the first line. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{prog} " + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: t.Sequence[t.Tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write(f"{'':>{self.current_indent}}{first}") + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> t.Iterator[None]: + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self) -> t.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + + for opt in options: + prefix = split_opt(opt)[0] + + if prefix == "/": + any_prefix_is_slash = True + + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/globals.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/globals.py new file mode 100644 index 00000000..191e712d --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/globals.py @@ -0,0 +1,67 @@ +import typing as t +from threading import local + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .core import Context + +_local = local() + + +@t.overload +def get_current_context(silent: "te.Literal[False]" = False) -> "Context": ... + + +@t.overload +def get_current_context(silent: bool = ...) -> t.Optional["Context"]: ... + + +def get_current_context(silent: bool = False) -> t.Optional["Context"]: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: "Context") -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: + """Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + + ctx = get_current_context(silent=True) + + if ctx is not None: + return ctx.color + + return None diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/parser.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/parser.py new file mode 100644 index 00000000..600b8436 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/parser.py @@ -0,0 +1,531 @@ +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" + +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + +# Sentinel value that indicates an option was passed as a flag without a +# value but is not a flag option. Option.consume_value uses this to +# prompt or use the flag_value. +_flag_needs_value = object() + + +def _unpack_args( + args: t.Sequence[str], nargs_spec: t.Sequence[int] +) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] + spos: t.Optional[int] = None + + def _fetch(c: "te.Deque[V]") -> t.Optional[V]: + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + + if nargs is None: + continue + + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def split_opt(opt: str) -> t.Tuple[str, str]: + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +def split_arg_string(string: str) -> t.List[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +class Option: + def __init__( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes: t.Set[str] = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({opt})") + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self) -> bool: + return self.action in ("store", "append") + + def process(self, value: t.Any, state: "ParsingState") -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class Argument: + def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], + state: "ParsingState", + ) -> None: + if self.nargs > 1: + assert value is not None + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + if self.nargs == -1 and self.obj.envvar is not None and value == (): + # Replace empty tuple with None so that a value from the + # environment may be tried. + value = None + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class ParsingState: + def __init__(self, rargs: t.List[str]) -> None: + self.opts: t.Dict[str, t.Any] = {} + self.largs: t.List[str] = [] + self.rargs = rargs + self.order: t.List[CoreParameter] = [] + + +class OptionParser: + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx: t.Optional["Context"] = None) -> None: + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args: bool = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options: bool = False + + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + + self._short_opt: t.Dict[str, Option] = {} + self._long_opt: t.Dict[str, Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: t.List[Argument] = [] + + def add_option( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ) -> None: + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument( + self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 + ) -> None: + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + self._args.append(Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: t.List[str] + ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state: ParsingState) -> None: + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state: ParsingState) -> None: + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt( + self, opt: str, explicit_value: t.Optional[str], state: ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we recombine the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: Option, state: ParsingState + ) -> t.Any: + nargs = option.nargs + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = _flag_needs_value + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = _flag_needs_value + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: ParsingState) -> None: + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/py.typed b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/shell_completion.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/shell_completion.py new file mode 100644 index 00000000..07d0f09b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/shell_completion.py @@ -0,0 +1,603 @@ +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import BaseCommand +from .core import Context +from .core import MultiCommand +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .parser import split_arg_string +from .utils import echo + + +def shell_complete( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: t.Optional[str] = None, + **kwargs: t.Any, + ) -> None: + self.value: t.Any = value + self.type: str = type + self.help: t.Optional[str] = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + %(complete_func)s "$@" +else + # eval/source/. command, register function for later + compdef %(complete_func)s %(prog_name)s +fi +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> t.Dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions( + self, args: t.List[str], incomplete: str + ) -> t.List[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + @staticmethod + def _check_version() -> None: + import shutil + import subprocess + + bash_exe = shutil.which("bash") + + if bash_exe is None: + match = None + else: + output = subprocess.run( + [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], + stdout=subprocess.PIPE, + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + echo( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ), + err=True, + ) + else: + echo( + _("Couldn't detect Bash version, shell completion is not supported."), + err=True, + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +ShellCompleteType = t.TypeVar("ShellCompleteType", bound=t.Type[ShellComplete]) + + +_available_shells: t.Dict[str, t.Type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: ShellCompleteType, name: t.Optional[str] = None +) -> ShellCompleteType: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + return cls + + +def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + # Will be None if expose_value is False. + value = ctx.params.get(param.name) + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(ctx: Context, value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + return c in ctx._opt_prefixes + + +def _is_incomplete_option(ctx: Context, args: t.List[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag or param.count: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(ctx, arg): + last_option = arg + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + args: t.List[str], +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + ctx = cli.make_context(prog_name, args.copy(), **ctx_args) + args = ctx.protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, MultiCommand): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) + args = ctx.protected_args + ctx.args + else: + sub_ctx = ctx + + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + sub_ctx = cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx.protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: t.List[str], incomplete: str +) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(ctx, incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(ctx, incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(ctx, args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/termui.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/termui.py new file mode 100644 index 00000000..c084f196 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/termui.py @@ -0,0 +1,784 @@ +import inspect +import io +import itertools +import sys +import typing as t +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Optional[t.Any] = None, + show_choices: bool = True, + type: t.Optional[ParamType] = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text: str, + default: t.Optional[t.Any] = None, + hide_input: bool = False, + confirmation_prompt: t.Union[bool, str] = False, + type: t.Optional[t.Union[ParamType, t.Any]] = None, + value_proc: t.Optional[t.Callable[[str], t.Any]] = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending an interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + return f(" ") + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) + continue + if not confirmation_prompt: + return result + while True: + value2 = prompt_func(confirmation_prompt) + is_empty = not value and not value2 + if value2 or is_empty: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: t.Optional[bool] = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(" ").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def echo_via_pager( + text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], + color: t.Optional[bool] = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast(t.Iterable[str], text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar( + iterable: t.Optional[t.Iterable[V]] = None, + length: t.Optional[int] = None, + label: t.Optional[str] = None, + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, +) -> "ProgressBar[V]": + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: A function called with the current item which + can return a string to show next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: The file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + Added the ``update_min_steps`` parameter. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. Added the ``update`` method to + the object. + + .. versionadded:: 2.0 + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + + # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor + echo("\033[2J\033[1;1H", nl=False) + + +def _interpret_color( + color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 +) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bold: t.Optional[bool] = None, + dim: t.Optional[bool] = None, + underline: t.Optional[bool] = None, + overline: t.Optional[bool] = None, + italic: t.Optional[bool] = None, + blink: t.Optional[bool] = None, + reverse: t.Optional[bool] = None, + strikethrough: t.Optional[bool] = None, + reset: bool = True, +) -> str: + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param strikethrough: if provided this will enable or disable + striking through text. + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.AnyStr]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, + **styles: t.Any, +) -> None: + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit( + text: t.Optional[t.AnyStr] = None, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + filename: t.Optional[str] = None, +) -> t.Optional[t.AnyStr]: + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + ed.edit_file(filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar: t.Optional[t.Callable[[bool], str]] = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> t.ContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: t.Optional[str] = None, err: bool = False) -> None: + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: The message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/testing.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/testing.py new file mode 100644 index 00000000..772b2159 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/testing.py @@ -0,0 +1,483 @@ +import contextlib +import io +import os +import shlex +import shutil +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import _compat +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from .core import BaseCommand + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> t.List[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> t.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + +def make_input_stream( + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]], charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast(t.IO[t.Any], input)) + + if rv is not None: + return rv + + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(input) + + +class Result: + """Holds the captured result of an invoked CLI script.""" + + def __init__( + self, + runner: "CliRunner", + stdout_bytes: bytes, + stderr_bytes: t.Optional[bytes], + return_value: t.Any, + exit_code: int, + exception: t.Optional[BaseException], + exc_info: t.Optional[ + t.Tuple[t.Type[BaseException], BaseException, TracebackType] + ] = None, + ): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or None if not available + self.stderr_bytes = stderr_bytes + #: The value returned from the invoked command. + #: + #: .. versionadded:: 8.0 + self.return_value = return_value + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self) -> str: + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string.""" + if self.stderr_bytes is None: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__( + self, + charset: str = "utf-8", + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + echo_stdin: bool = False, + mix_stderr: bool = True, + ) -> None: + self.charset = charset + self.env: t.Mapping[str, t.Optional[str]] = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli: "BaseCommand") -> str: + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env( + self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None + ) -> t.Mapping[str, t.Optional[str]]: + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation( + self, + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + color: bool = False, + ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + ``stderr`` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + bytes_output = io.BytesIO() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, bytes_output) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + bytes_output, encoding=self.charset, name="", mode="w" + ) + + bytes_error = None + if self.mix_stderr: + sys.stderr = sys.stdout + else: + bytes_error = io.BytesIO() + sys.stderr = _NamedTextIOWrapper( + bytes_error, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(prompt or "") + val = text_input.readline().rstrip("\r\n") + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + return text_input.readline().rstrip("\r\n") + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + old__compat_should_strip_ansi = _compat.should_strip_ansi + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + _compat.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in env.items(): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, bytes_error) + finally: + for key, value in old_env.items(): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + _compat.should_strip_ansi = old__compat_should_strip_ansi + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: "BaseCommand", + args: t.Optional[t.Union[str, t.Sequence[str]]] = None, + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + catch_exceptions: bool = True, + color: bool = False, + **extra: t.Any, + ) -> Result: + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: t.Optional[BaseException] = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + if self.mix_stderr: + stderr = None + else: + stderr = outstreams[1].getvalue() # type: ignore + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: t.Optional[t.Union[str, "os.PathLike[str]"]] = None + ) -> t.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + dt = tempfile.mkdtemp(dir=temp_dir) + os.chdir(dt) + + try: + yield dt + finally: + os.chdir(cwd) + + if temp_dir is None: + try: + shutil.rmtree(dt) + except OSError: + pass diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/types.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/types.py new file mode 100644 index 00000000..a70fd58c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/types.py @@ -0,0 +1,1093 @@ +import os +import stat +import sys +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import format_filename +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter: t.ClassVar[t.Optional[str]] = None + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + + # Custom subclasses might not remember to set a name. + if hasattr(self, "name"): + name = self.name + else: + name = param_type + + return {"param_type": param_type, "name": name} + + def __call__( + self, + value: t.Any, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: "Parameter") -> t.Optional[str]: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: "Parameter") -> t.Optional[str]: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> t.Sequence[str]: + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail( + self, + message: str, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> "t.NoReturn": + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name: str = func.__name__ + self.func = func + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = sys.getfilesystemencoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + The resulting value will always be one of the originally passed choices + regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` + being specified. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = "choice" + + def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: + self.choices = choices + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + choices_str = "|".join(self.choices) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: "Parameter") -> str: + return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = {choice: choice for choice in self.choices} + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = { + ctx.token_normalize_func(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if not self.case_sensitive: + normed_value = normed_value.casefold() + normed_choices = { + normed_choice.casefold(): original + for normed_choice, original in normed_choices.items() + } + + if normed_value in normed_choices: + return normed_choices[normed_value] + + choices_str = ", ".join(map(repr, self.choices)) + self.fail( + ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: t.Optional[t.Sequence[str]] = None): + self.formats: t.Sequence[str] = formats or [ + "%Y-%m-%d", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + ] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[t.Type[t.Any]] + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: "te.Literal[1, -1]", open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + if not open: + return bound + + # Could use Python 3.9's math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if value in {False, True}: + return bool(value) + + norm = value.strip().lower() + + if norm in {"1", "true", "t", "yes", "y", "on"}: + return True + + if norm in {"0", "false", "f", "no", "n", "off"}: + return False + + self.fail( + _("{value!r} is not a valid boolean.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Files can also be opened atomically in which case all writes go into a + separate file in the same folder and upon completion the file will + be moved over to the original location. This is useful if a file + regularly read by other users is modified. + + See :ref:`file-args` for more information. + + .. versionchanged:: 2.0 + Added the ``atomic`` parameter. + """ + + name = "filename" + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: t.Optional[bool] = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: "t.Union[str, os.PathLike[str]]") -> bool: + if self.lazy is not None: + return self.lazy + if os.fspath(value) == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, + value: t.Union[str, "os.PathLike[str]", t.IO[t.Any]], + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> t.IO[t.Any]: + if _is_file_like(value): + return value + + value = t.cast("t.Union[str, os.PathLike[str]]", value) + + try: + lazy = self.resolve_lazy_flag(value) + + if lazy: + lf = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + if ctx is not None: + ctx.call_on_close(lf.close_intelligently) + + return t.cast(t.IO[t.Any], lf) + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + + return f + except OSError as e: + self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +def _is_file_like(value: t.Any) -> "te.TypeGuard[t.IO[t.Any]]": + return hasattr(value, "read") or hasattr(value, "write") + + +class Path(ParamType): + """The ``Path`` type is similar to the :class:`File` type, but + returns the filename instead of an open file. Various checks can be + enabled to validate the type of file and permissions. + + :param exists: The file or directory needs to exist for the value to + be valid. If this is not set to ``True``, and the file does not + exist, then all further checks are silently skipped. + :param file_okay: Allow a file as a value. + :param dir_okay: Allow a directory as a value. + :param readable: if true, a readable check is performed. + :param writable: if true, a writable check is performed. + :param executable: if true, an executable check is performed. + :param resolve_path: Make the value absolute and resolve any + symlinks. A ``~`` is not expanded, as this is supposed to be + done by the shell only. + :param allow_dash: Allow a single dash as a value, which indicates + a standard stream (but does not open it). Use + :func:`~click.open_file` to handle opening this value. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.1 + Added the ``executable`` parameter. + + .. versionchanged:: 8.0 + Allow passing ``path_type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: t.Optional[t.Type[t.Any]] = None, + executable: bool = False, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.readable = readable + self.writable = writable + self.executable = executable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name: str = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result( + self, value: "t.Union[str, os.PathLike[str]]" + ) -> "t.Union[str, bytes, os.PathLike[str]]": + if self.type is not None and not isinstance(value, self.type): + if self.type is str: + return os.fsdecode(value) + elif self.type is bytes: + return os.fsencode(value) + else: + return t.cast("os.PathLike[str]", self.type(value)) + + return value + + def convert( + self, + value: "t.Union[str, os.PathLike[str]]", + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> "t.Union[str, bytes, os.PathLike[str]]": + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + # os.path.realpath doesn't resolve symlinks on Windows + # until Python 3.8. Use pathlib for now. + import pathlib + + rv = os.fsdecode(pathlib.Path(rv).resolve()) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} {filename!r} is a directory.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.executable and not os.access(value, os.X_OK): + self.fail( + _("{name} {filename!r} is not executable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types: t.Sequence[t.Union[t.Type[t.Any], ParamType]]) -> None: + self.types: t.Sequence[ParamType] = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + pass + + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but +#: internally no string conversion takes place if the input was bytes. +#: This is usually useful when working with file paths as they can +#: appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/utils.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/utils.py new file mode 100644 index 00000000..836c6f21 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/click/utils.py @@ -0,0 +1,624 @@ +import os +import re +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType +from types import TracebackType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: "t.Callable[P, R]") -> "t.Callable[P, t.Optional[R]]": + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args: "P.args", **kwargs: "P.kwargs") -> t.Optional[R]: + try: + return func(*args, **kwargs) + except Exception: + pass + return None + + return update_wrapper(wrapper, func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(sys.getfilesystemencoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, + filename: t.Union[str, "os.PathLike[str]"], + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, + ): + self.name: str = os.fspath(filename) + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.Optional[t.IO[t.Any]] + self.should_close: bool + + if self.name == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO[t.Any]: + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except OSError as e: + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self) -> "LazyFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.close_intelligently() + + def __iter__(self) -> t.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO[t.Any]) -> None: + self._file: t.IO[t.Any] = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> "KeepOpenFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> t.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.Any]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + return + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: t.Optional[t.Union[str, bytes]] = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message and the value looks like bytes, we manually + # need to find the binary stream and write the message in there. + # This is done separately so that most stream types will work as you + # would expect. Eg: you can write to StringIO for other cases. + if isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file, color) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: + """Returns a system stream for byte processing. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: "te.Literal['stdin', 'stdout', 'stderr']", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", +) -> t.TextIO: + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts for already + correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: t.Union[str, "os.PathLike[str]"], + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO[t.Any]: + """Open a file, with extra behavior to handle ``'-'`` to indicate + a standard stream, lazy open on write, and atomic write. Similar to + the behavior of the :class:`~click.File` param type. + + If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is + wrapped so that using it in a context manager will not close it. + This makes it possible to use the function without accidentally + closing a standard stream: + + .. code-block:: python + + with open_file(filename) as f: + ... + + :param filename: The name or Path of the file to open, or ``'-'`` for + ``stdin``/``stdout``. + :param mode: The mode in which to open the file. + :param encoding: The encoding to decode or encode a file opened in + text mode. + :param errors: The error handling mode. + :param lazy: Wait to open the file until it is accessed. For read + mode, the file is temporarily opened to raise access errors + early, then closed until it is read again. + :param atomic: Write to a temporary file and replace the given file + on close. + + .. versionadded:: 3.0 + """ + if lazy: + return t.cast( + t.IO[t.Any], LazyFile(filename, mode, encoding, errors, atomic=atomic) + ) + + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + + if not should_close: + f = t.cast(t.IO[t.Any], KeepOpenFile(f)) + + return f + + +def format_filename( + filename: "t.Union[str, bytes, os.PathLike[str], os.PathLike[bytes]]", + shorten: bool = False, +) -> str: + """Format a filename as a string for display. Ensures the filename can be + displayed by replacing any invalid bytes or surrogate escapes in the name + with the replacement character ``�``. + + Invalid bytes or surrogate escapes will raise an error when written to a + stream with ``errors="strict"``. This will typically happen with ``stdout`` + when the locale is something like ``en_GB.UTF-8``. + + Many scenarios *are* safe to write surrogates though, due to PEP 538 and + PEP 540, including: + + - Writing to ``stderr``, which uses ``errors="backslashreplace"``. + - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens + stdout and stderr with ``errors="surrogateescape"``. + - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. + - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. + Python opens stdout and stderr with ``errors="surrogateescape"``. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + else: + filename = os.fspath(filename) + + if isinstance(filename, bytes): + filename = filename.decode(sys.getfilesystemencoding(), "replace") + else: + filename = filename.encode("utf-8", "surrogateescape").decode( + "utf-8", "replace" + ) + + return filename + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no effect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO[t.Any]) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: t.Optional[str] = None, _main: t.Optional[ModuleType] = None +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if _main is None: + _main = sys.modules["__main__"] + + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + # It is set to "" inside a Shiv or PEX zipapp. + if getattr(_main, "__package__", None) in {None, ""} or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: t.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> t.List[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This is intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionchanged:: 8.1 + Invalid glob patterns are treated as empty expansions rather + than raising an error. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + try: + matches = glob(arg, recursive=glob_recursive) + except re.error: + matches = [] + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__init__.py new file mode 100644 index 00000000..7f4c631b --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__init__.py @@ -0,0 +1,49 @@ +from typing import Any, Optional + +from .main import (dotenv_values, find_dotenv, get_key, load_dotenv, set_key, + unset_key) + + +def load_ipython_extension(ipython: Any) -> None: + from .ipython import load_ipython_extension + load_ipython_extension(ipython) + + +def get_cli_string( + path: Optional[str] = None, + action: Optional[str] = None, + key: Optional[str] = None, + value: Optional[str] = None, + quote: Optional[str] = None, +): + """Returns a string suitable for running as a shell script. + + Useful for converting a arguments passed to a fabric task + to be passed to a `local` or `run` command. + """ + command = ['dotenv'] + if quote: + command.append(f'-q {quote}') + if path: + command.append(f'-f {path}') + if action: + command.append(action) + if key: + command.append(key) + if value: + if ' ' in value: + command.append(f'"{value}"') + else: + command.append(value) + + return ' '.join(command).strip() + + +__all__ = ['get_cli_string', + 'load_dotenv', + 'dotenv_values', + 'get_key', + 'set_key', + 'unset_key', + 'find_dotenv', + 'load_ipython_extension'] diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__main__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__main__.py new file mode 100644 index 00000000..3977f55a --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__main__.py @@ -0,0 +1,6 @@ +"""Entry point for cli, enables execution with `python -m dotenv`""" + +from .cli import cli + +if __name__ == "__main__": + cli() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53358ae3d67351c2ea5a2e226dd50aeeeb3391d6 GIT binary patch literal 1699 zcmZ`(&ube;6rS1N(n_)ut8P*!@#5G8QEW9er8&5P5K|M1Roo;OL0PXgD|zMJl{~u= zm05!eK2#?wg%Uvsn4S{S|D>0eI8<5)HT2}0S|0*F_03AM-QYY)-@bYC>HYXLqu-Lr zI0E~6{-~4?5&D}ghL#vO$3KDd1QA5AjU1fE4wvUJA{^mu-VySGBj!a%%1e%%mmMXq zII(;T_5~9Ykw`^>$h$&59z(+y86k?vnd()@OJb*9{M1uVy~NNf#z}Hl%qL2Sq<+Eq zWJAh~9+|)we3HVIN@@mBJ*c_@-Oe>xNx3y-+P$F46n3P%fFizF{^( z)vg$4QEw29)!d;gTh)fYUU5T-ntqMCxdKZ+G#(uGIo1F`B1||Y(Kg12LjexZ%K;ms z2Fma`3L2vf4#%UigVehDJv8b;^Dj8cM5iMRMgcqyK+{gX%Rcf<>SfIh!}Zq7Fo|Jj z@85s8oL#=Vcq_YEv$h<=^G%wq!^m0NTFds^o}at*S=O_BbGB*}HjI+#W&09jb=`6; zU)SfVjeb2=RAx1k06XZ7knIW|wZC{R+&qQ=3WciSuZNORU^0h1Q%{Vv4aLnGNL^sF z4UPGcFpD4n6Q+c>#Xz9xKrEjZaKI;AAUs9SxHGu|^jpm(^Ku3Vfqz~?e@^v-)& z=j-zH6CwnB9ntZN*+dNZr-+Ep__N&ZrHi@2ISvuZOp$ji5QkaH=k*(~UJjlQ;6QKv z`fYRqJ#9s~VnX63wqbg`%-Wt%Bwo-bVCo2(Fp`W31Yhf?=;}PDmlI8dg$a&i!C)en>#T{YE7jP2!`x%T`)VzN7u?u?DMXC5zf z(i2Z|k8}Gg`?dYj^OgOD*Xd6W2eHo&(wRdwwRgLDyS4O6z4oU%^@lq3N}c{)n5LJZ zvy2jTN@L(tHWO7Cus>p|GGMnbx|10($1IZyCBIRHpNp~+Lp^q5CxYLT l5bWG+Uhm0lr6Ab5*Zi^( literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c2f4d568b20b811b5948b35f8114154b8ca4509 GIT binary patch literal 363 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 PGPEY4{>KVFBF+B;3^e5H literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4449db08d3a1df8051888adc96739ecbf930b946 GIT binary patch literal 16463 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 OO$&ART*zl+^#1@RbWdCW literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..803dd7f42ec0bfe84645b116413be5af33b1f3cc GIT binary patch literal 10005 zcmc&aTW}jka=X}FVDTnMfKTxuf)WYRBqiITWXY1sk| zk_baK&r#|~`!1sHu0pV)ig;E2ph`+Cf1OiFRW4P@SAGD4DMEYv$m=8igH2ZXqOWw% zViymA7w0QeM9*|j&#R}qr)QS`>~z{FNEcrFX7ZGmqW%LBJ@JLY_E{4}txy6b&=G1( z%jq#1a8tw-WyY8&JH|%2F)nHzGe<3BmMA~QN3CPlsBO$fQ$nx6h<1S$9RervqP+>a zoiGdLd)%1QM2Swp@`Tn#8gmhx7wPFXeGnGz#9o(Yv4@;uQTvwf_n|Th2TB|-$U?v18+4^Z&O0U zJxXX4%}8_)OJE`0qPz@9vy_%3bZzHuhG7fP}_mpVQ~6|z4{)IUExGK z>_z82cC1VAi+^AN(^u>zp zWVcx%0Cj4b%%beWD)kLi&Bqnad9wS?o**(sR3 z<;uvp)9;=c4wxi6w38eFWE`ra&(Hy zn{!i%Xh?U4z>h$`tOxsY_emKn@-iCTA z;piEc#$!qRlL855T<#6fWa0_i)epu;vGQ7P!q;>1sCZ{KE-41FFK{wp?e4kyLHD)3 zKzG6prQ_rNaT&0Lv*)oj~eDQfI;jJ!r!P5{q~`1n;Ae!MeueIh0)x2`2D8s%CTg`lT` z4N}{kKv|(g3jN)f=?Vqf%?k9JKovp11rwI$nE(swDossJfx40nSJ}u^OdJWARX!Mu zfl>#9sx26d#)Y{EmL0+1&ACvdP{V*4tL|Vh6pO``5Nf>)Jj_%~c}z(@7(uE-(4Yg{ zPZ?F}PpO>4{U;Z4Hs`%_8YA*lU&$$`say$Kr^pr711l@wWL2UWY8bLo3zS&0QVv#R zIRz?#bU^D1{M6qy5SjTe@$a-t-~B`|Rbdy|?Gv>-rLlyK@&D*~LU%3hDhBT_r! z#dYpQ6aoHZ1h7u4XW75hnq}*A_PXWMOUJWpW6o7iaQD3nT5Du2Tf7+vn6}RYC@x;0 zMMf~ej}cgKe;ha`7M5s(Ly3Jt8o(iA7VLrrYAgaT@`RHWtbkkR*?>dk-;0AK!cM7N z_y$;?)Clb)CxDT#t~}Ti+C1Xh9ROCSB%P#!P|{M;1Q@Mj^OWR<@?(<}fQ)nqZiSV_ z$V8DMV`m*59YiBgxu#-MN-&u4=<^xSN!W>817Ly5`I;BmpWAZY#zpoQRwApgF)VPP zk0X<;hr$ZXISFUIV0y|FeO!PYk#H^FU^}S~0q$CWR+(@_mXTVR6DKPnNlCbj2@$*> z7-U@D0`+h1+LUL_v*GrqdA~Lp>{(BS#NGi4N^DxMDap&ENLP2_FG-e68$9wW(2>f; zl^fuNaWq|;j4Ub%M{(Ywau8}|+*u;Sm8%b~YI1B^Isf3iAxmQMWycMMPDG$jp#W>3 z?o?fcf;=Q8X+0Q7fDVOCB|3s_af2#Sv8{rJMbfk$vgriK6%ybf0mdlExne9s`UMRP zn2ElrOhk-ndW~wNS|-R*6#=b_iMP?e6=X@)UnWUQNVpY(b2?FDNV7mW1U<>G0sx8f zj{CMxZNCnu_Wx=o!|(lt4Jp=7t-l_9So^4XwfXaR)+e$}hqAt*3_tW|n%=^YXk=0k zfB-AKrk6F-3)m{14hE7EDxYc(M?$h372zZmB-~i(bp*sAy@90)FN7nIVXz>-1K=K& zH<`GmR5(vTwq8fFXWnhZ@;qhsd}pG$u5AWNc~UZ)xb{46;tp#~4zCG2z#LYFI%x^PQTWLi_1vR!EU%4-^s*7L9@F+m0E#1` zd(_SX!6Yyc*|FgEIB=Ne2@`Ra7Qu6=>)tZQv&DfV04lZqiYL+W>b8cG0Ex zD!R22@H(Kb22N0yYJOh~38JK8P$!0>1!rm~CrlB`#H@Zv<_oStml@!C(j9oIYgG&b znl_9@=Z8qHP=po+-w$q~%aAgRM`dC9f)@7?B|>FW`C0wIV51>vMmL?4P*-X?L{}4T zO%#SNCtT=s!D{OFtjs)^`BfA=k$tPN;=voi8vB((| zv1pxe1{%m60ASJXy8CyR?ryp}Gw#mMN7ubyv^;Lf?mLumA4>CwUOv!JNryq`pbIG|Z ztVAC~|Ap^*c`+z_vY5YyLh0QFCW{tPk*Y7D+O`2FU(p!QYMjleEL8+EZ5%Geex4e~ z%qSHwjew%#&THX}S&Lx_fe4U9Iz)gZeyWtBZL%OmQAl_SHc=#m{N9v<6?=>Z$V)<4XVBY)dcl_;G`2UVzXgKj3z$Am~_W+0k}#Xhsw^1;!MI` zkP;$z*Of8Y(G2Lrr4LiDKRUj8e6wXB(=t#hp5I-`44zNBFQj=blCCa_e}}IAKSXiY zR19&FCfyj5G`btfu2^AOBnd_k^$CR8)of!LHLoHSd!(tPiRf&i4n6qMj^UWl5ufPL z9vL7iB6@4=ghbpLIdL(52r$IANw_ii1|iQyl(J}DdJAfd4Z;ydfgqzZh7AJkYb1?*1DVzX&%D2F{jzoQ;F-+9Gryb59K4wJTv{}5*F?YG~Y^e zsStpV1U!|YC~A`yPGh_+?MHAH0mjan<42Dzk&yfnme3$1Jc1;&Vd)Bjih%Y6(h%TJ zM%Rc@IK%BrNo)Sq+u+2xee17pW0tqk+)%1(n}TfHOasBpa<nr?iI5=;vb>Aq+SV-V%x@e>ZhO}FmH*4u9W0XdlgUW9U1jEkDoo7j zG8EvkoGv~gD&VHHgbyNusfa`P%iLqZIH+kO!qR!+zGf=k*g*Z@0*?AY!s4>94x8fp z(Dp?DrSU;E4_JMuqURJ$y3N9njCSWwxaMM0;kY37i*h(LE5fUU8PPDjwE~2a$`Ngb z_d=q=7?l@Z0~{IyghF5!iLL^s^&=0w8HtBO5&6VGDOVU;>ra+$AI5#DE03&T@Yl6Yx5 z`EdAi|LS>Elao(hLoGR(H&YJJ{Wq50SRP-42h-j(+pBq1aPoLzDccMjkLbZ)LV+BX zD2$3!6!%>^2@fqZa7~ctd2qr4L&{CCP1s9CDqc!-w>1vEqjMd_0IgaJbn_&=+yXUf z5b9pg{ugvN1nk5n(FoPrpbQUu@KSkm4j!0=AU^atgLAPW3X=W+Iaz%Dk~*PSE@~@z zlE#LT2$fUFfX5wpD!b?Yv87|nH$OYEa3*K5FUp^M2=RT+>Rhh-v?b?h*z|N}Je?c< zLs`$zl6kQXAi<5|x^tjgJ43+KsZlx+ek1=$4j7rSjj(G1H(Ll-YQ z)lM{g7Xz~_hg~pN#g(@XuwEg z7CfvbS`eX97UFp|p;mM-18vdU$Oiy`d|lp6S9`|Q{<%BrI`GrC7cS$&|IpIVav=5o znm23TziIE!*!#2g!8AMgvhWN~wgcVmCcLT|+`WqqVvi)13A!YxQ;cf}1Y-qn2^y_i z!*2Z=mycch#g`P4D*9z_p}ld65gH_oKmgpHS+ff%1WjMiouKNIq-1+RJ4q4Vwu`pn zt*{ksSJAbozOt%d!Rx8spb($CUbHUl1>ILh)tM#S-GZ@60+b~`fO1>2YigkljG8cy zEO>FLVr|MN$y{C2W?fgNu4`l88`-*}OZ=j5%iX%s_S&;6S@*Fte++HW`{|w^!k6}R zWvpE}ckO?={cC5l?!GkN_p(mmqYE*}W!T-_bV@fInzHWZ&0f+Z2-~PX_M{`XmRt|u z(=~A0VJ;O(A6cNEnw}KK*wv#NI;CqJO;yt)@a)w+GTJ*y#rD972Y5vi7@b34$*Hh+ zmma-(L!BRHgkM)kDr)v!Q_LjbX;FP%cmXG=*vl@Q%`bBnr3_y$hD|?#`}J+=4)YW0HVyWE7EV7r!-#Q7U0B+O zKsz3fUk=o0K`c2OeZeSP?WXVnJb3#Ce2$gjbF8R^x_hw|M!BjbsC^|R$De91asbsW;p7O0K?T$I5wK5F0yPc?V^6YmFavZ}6R4u7;F3>uO(Q zj7}f+ZSea`j{MZ<*Y=K_qjuBLnsKx~oY`>nZutk+Z)N>MOT+&PAE<_lO?x(Ye-V3S zgYVvQ*XL^La+1m&ri2eVoYnS+9S1~f-%*y5g+1)w;Co0@Z?3k! zylFjY`W-gSbI|C8j6wP@-=fc0sDJRDdKI#Nv>Y4en15nvfD*pMmc<&Vs_2rp7XVzK zXmD@E|1KyoJ_z)x1!%hKk=l!KNAY9OpVKQe7{niMN&mcU9$fxkF}G>*0TGnr1k6QK zNZfk}C~(>&swj&m9GadK-rE;|=PCS19PwY&AK+EZS+{)lvkw-|=4>_h2bTsnY%N=^ zmekp-%l|d+hky)1IUsM^TK-$cBm9#$PSAg6Izhud08jBiuk>TcNQ9%BmHAnSDJ7Jb zgg#aa-7!AZz6=-dfq1TK7fG~v@^1{%5h$tFOII#lK6mll$gp%9Yw(B=zKJ=*8;X7fG{MQLFI!%mtk`p5)M=>!~Vo}lp zR+L{?U+`~gpZHHm_n;Qcjgr>^<{6r%e@{7oPg%b=(e%Lg6actf&;#G{G<{@QhWiG6 z1ivUj_UuPrjea?fwMV|?DM$Ts9AdTw{&{2P+R!uUx5+P)8;xhul<&E#G1Z!NbuZYT z+q`LCf7UjzV0rFqUvp%A{b{Q9c};WbM7E}P!3mt{ra;!!3#<)$)15=vhQn#fTUM^! zle(6z?OSj^xBJrd2ebB9VMupVy7_R{ePqD_ouyk2Wow3@x5m!2e<<4sUHEWPN3)Fs zP~0(_XxCx_zHrg59UDv6EKcuGkbUoR(}%yM0PJ+pv~}^^4y?@jJ-?T3`<4Qbe}`u2 zzEn3{=U>S~gT7}B$-ZLX;!gMFT|Dhxp2$;>tu?Ouf77~+#eBVqKCo5~pWx^N>!;xp z9DN{fv(vAn%y|m3HMqJ#mfzD!+fw`U6l7~Z+Quw@o@VH-RBh_?Y6H9;&|PakUZ2eD L8`{A#iCq2%f*oVT literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0991b22609344e40db343a2aa1d129e17b737da9 GIT binary patch literal 5036 zcmb_gTTC3+89sB}*=5;fxtM})_|7^Q3^=jt`Vt#_i)#|amnv)G)vz;|#e2bL22wVQ z>O_`;+f;?N>aLYWh9`sUs^lr|Q}f=J#aJpGSxThlp?O;sDz$#<|DTyz*fow+sYlv# z`OiQ9obzA4|DXL!b+wN`yV(8R%{DI~f5(N}BxkZ>!6Zkn5{+nFf<$oS6I_yy@JS&e zaJUu{Vp57oNjV}XJrPe*i6|W5iB5)VU2$upCIY>FZSBq;@%AiIr7OC>2^M;_CLM#3 zC+CPJ-zAzy=N~JN1cxuc=w6`v^gxLkWYj94`qxowv})b21$0RdpyWYO3*HqYp>Zx; z^Bs!o3-gxe)ajl}x~W$xgC#tmYp<>_o$%NLhXNeZUGb44CgK~H!yZdKWu}vsls1QSYRObLM`8Y`fM0}uQWE`xW>Td7s>M-J_eqcn6-BNGrMu(O*k;hfG(LOSc zhf3+uXr>C)(rz#6;N8Yv=^yd84rO>WPdATa|+Z&5jyPntWDEN0Q*ELOM z3QE%oa1u)Z(Per>D$}C~lN=c*GzgPhwjU$+R|_z_~vfy*;WXoEmJziz*>R17xomG`!ug!r3<=W7s`SH<@jK~dRzc4 zdVUNJLLv60F*Px&(`tBiUzrurK+KA$h#bjsSrUbr-CUb;bPo{1j$v_LW>~OQJQX*= z%W9nWfuq@!ZO99djn-{wo)mxSV@8Or4>^22JHk$w-Y;UO!oo*JjYzmKc{CS5iQ# zL_S@#5lj;_aZq+}Phc1*1CGg1OnEecC40m@FU);_fnJzbK|uxh=Smo~3j=&s)T$T; ziebN{Tyu&KOT@fkd7RqC0Yfyl+e%>A0+dQH%<=$@rEqtlk*7z1m;MmCuwW;?62VRK zcFIA6W^ zf1&TI9fe?TLFu&}1jC>#=tLl}i~SxZWf1cJ097)qfY^#Q$Zrg`K;4jgJqSy*9i-XF z#BjG{ae5Fo%D{l3ZqU`W1G~s?pnhKgyEXMW@3c36=)tl3#|pvLxvPJS%txLy{CVr2 zwiepXEe6jOlyl$X9ubgSrp5mOh&N75gF+=di?j>gV(Vb-`jzg2FjeL*Haug!Wwbz7 z4$tq+zPBKL>HorCs6W0GJW)_i*#7boNSFL212SF((jWOZ2JaN7aZuEA!|Nj->DT-3VypRVKr%{ zrsNh*l6Vstk3t7wv~%ynw%NAA&ZASib8WwF`--3REQjiIjnj?!`Ug$-n`X`}h1#HG zZ`xjHdTny7pmZmOkh4OTyVVOv3z?{J*0NYw3(e%Q=)UK7T#n<2iKVg4A!X&qlIv&o zZdRP&K0PlIv#P{J+~+4eAklLR&OvJ{-s5@sJ>&3s_6OkuE-d#^Omb^U%dTM%i^4L+ z(^$$Ne1zg>1AMlQs3}%LFr!;SLQjPiR*YG4Y?K=CKZBH1&DfA7K}AYU{7BT+WLq*k zaMK(z5K+OK-Oug~*6VGd# zW~7;(DhX5f_SLwBhO*Q-?a_8)_r+P~M z_-D@p4f!)Od*?P4wj6vG=v-1divm#^|6`zkeSBIxEpy>oi>JCJr~@&ISi(L&E!iB$ z|6M40&$EuW}0X4|AGw+^$`|=s4aaQlaUnNmBl}ei`{##=}MUO^bQ$ABr z#aHYL<(U0te1g6U%vhTkA3#?WIF5TxykC=jUz5X2!!D?5Ff{{HY;2&H}#W$5gb=H)o{&|+A4uzb#EPaXwqCIFcjNr XxUPJ65$IhrN9KBGPasPd3(fxm^*i5; literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..796782f984367ee43597204dccb30afc53703341 GIT binary patch literal 215 zcmX@j%ge<81m4Ck)5U=FV-N=h7@>^M96-i&h7^V8EBV<`rjTW#*+M=IDERhWP6HI=UF@7nWvL!;+GfYd None: + """This script is used to set, get or unset values from a .env file.""" + ctx.obj = {'QUOTE': quote, 'EXPORT': export, 'FILE': file} + + +@contextmanager +def stream_file(path: os.PathLike) -> Iterator[IO[str]]: + """ + Open a file and yield the corresponding (decoded) stream. + + Exits with error code 2 if the file cannot be opened. + """ + + try: + with open(path) as stream: + yield stream + except OSError as exc: + print(f"Error opening env file: {exc}", file=sys.stderr) + exit(2) + + +@cli.command() +@click.pass_context +@click.option('--format', default='simple', + type=click.Choice(['simple', 'json', 'shell', 'export']), + help="The format in which to display the list. Default format is simple, " + "which displays name=value without quotes.") +def list(ctx: click.Context, format: bool) -> None: + """Display all the stored key/value.""" + file = ctx.obj['FILE'] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + if format == 'json': + click.echo(json.dumps(values, indent=2, sort_keys=True)) + else: + prefix = 'export ' if format == 'export' else '' + for k in sorted(values): + v = values[k] + if v is not None: + if format in ('export', 'shell'): + v = shlex.quote(v) + click.echo(f'{prefix}{k}={v}') + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +@click.argument('value', required=True) +def set(ctx: click.Context, key: Any, value: Any) -> None: + """Store the given key/value.""" + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + export = ctx.obj['EXPORT'] + success, key, value = set_key(file, key, value, quote, export) + if success: + click.echo(f'{key}={value}') + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def get(ctx: click.Context, key: Any) -> None: + """Retrieve the value for the given key.""" + file = ctx.obj['FILE'] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + stored_value = values.get(key) + if stored_value: + click.echo(stored_value) + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def unset(ctx: click.Context, key: Any) -> None: + """Removes the given key.""" + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + success, key = unset_key(file, key, quote) + if success: + click.echo(f"Successfully removed {key}") + else: + exit(1) + + +@cli.command(context_settings={'ignore_unknown_options': True}) +@click.pass_context +@click.option( + "--override/--no-override", + default=True, + help="Override variables from the environment file with those from the .env file.", +) +@click.argument('commandline', nargs=-1, type=click.UNPROCESSED) +def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: + """Run command with environment variables present.""" + file = ctx.obj['FILE'] + if not os.path.isfile(file): + raise click.BadParameter( + f'Invalid value for \'-f\' "{file}" does not exist.', + ctx=ctx + ) + dotenv_as_dict = { + k: v + for (k, v) in dotenv_values(file).items() + if v is not None and (override or k not in os.environ) + } + + if not commandline: + click.echo('No command given.') + exit(1) + ret = run_command(commandline, dotenv_as_dict) + exit(ret) + + +def run_command(command: List[str], env: Dict[str, str]) -> int: + """Run command in sub process. + + Runs the command in a sub process with the variables from `env` + added in the current environment variables. + + Parameters + ---------- + command: List[str] + The command and it's parameters + env: Dict + The additional environment variables + + Returns + ------- + int + The return code of the command + + """ + # copy the current environment variables and add the vales from + # `env` + cmd_env = os.environ.copy() + cmd_env.update(env) + + p = Popen(command, + universal_newlines=True, + bufsize=0, + shell=False, + env=cmd_env) + _, _ = p.communicate() + + return p.returncode diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/ipython.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/ipython.py new file mode 100644 index 00000000..7df727cd --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/ipython.py @@ -0,0 +1,39 @@ +from IPython.core.magic import Magics, line_magic, magics_class # type: ignore +from IPython.core.magic_arguments import (argument, magic_arguments, # type: ignore + parse_argstring) # type: ignore + +from .main import find_dotenv, load_dotenv + + +@magics_class +class IPythonDotEnv(Magics): + + @magic_arguments() + @argument( + '-o', '--override', action='store_true', + help="Indicate to override existing variables" + ) + @argument( + '-v', '--verbose', action='store_true', + help="Indicate function calls to be verbose" + ) + @argument('dotenv_path', nargs='?', type=str, default='.env', + help='Search in increasingly higher folders for the `dotenv_path`') + @line_magic + def dotenv(self, line): + args = parse_argstring(self.dotenv, line) + # Locate the .env file + dotenv_path = args.dotenv_path + try: + dotenv_path = find_dotenv(dotenv_path, True, True) + except IOError: + print("cannot find .env file") + return + + # Load the .env file + load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) + + +def load_ipython_extension(ipython): + """Register the %dotenv magic.""" + ipython.register_magics(IPythonDotEnv) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/main.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/main.py new file mode 100644 index 00000000..7bc54285 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/main.py @@ -0,0 +1,392 @@ +import io +import logging +import os +import pathlib +import shutil +import sys +import tempfile +from collections import OrderedDict +from contextlib import contextmanager +from typing import (IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple, + Union) + +from .parser import Binding, parse_stream +from .variables import parse_variables + +# A type alias for a string path to be used for the paths in this file. +# These paths may flow to `open()` and `shutil.move()`; `shutil.move()` +# only accepts string paths, not byte paths or file descriptors. See +# https://github.com/python/typeshed/pull/6832. +StrPath = Union[str, 'os.PathLike[str]'] + +logger = logging.getLogger(__name__) + + +def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: + for mapping in mappings: + if mapping.error: + logger.warning( + "Python-dotenv could not parse statement starting at line %s", + mapping.original.line, + ) + yield mapping + + +class DotEnv: + def __init__( + self, + dotenv_path: Optional[StrPath], + stream: Optional[IO[str]] = None, + verbose: bool = False, + encoding: Optional[str] = None, + interpolate: bool = True, + override: bool = True, + ) -> None: + self.dotenv_path: Optional[StrPath] = dotenv_path + self.stream: Optional[IO[str]] = stream + self._dict: Optional[Dict[str, Optional[str]]] = None + self.verbose: bool = verbose + self.encoding: Optional[str] = encoding + self.interpolate: bool = interpolate + self.override: bool = override + + @contextmanager + def _get_stream(self) -> Iterator[IO[str]]: + if self.dotenv_path and os.path.isfile(self.dotenv_path): + with open(self.dotenv_path, encoding=self.encoding) as stream: + yield stream + elif self.stream is not None: + yield self.stream + else: + if self.verbose: + logger.info( + "Python-dotenv could not find configuration file %s.", + self.dotenv_path or '.env', + ) + yield io.StringIO('') + + def dict(self) -> Dict[str, Optional[str]]: + """Return dotenv as dict""" + if self._dict: + return self._dict + + raw_values = self.parse() + + if self.interpolate: + self._dict = OrderedDict(resolve_variables(raw_values, override=self.override)) + else: + self._dict = OrderedDict(raw_values) + + return self._dict + + def parse(self) -> Iterator[Tuple[str, Optional[str]]]: + with self._get_stream() as stream: + for mapping in with_warn_for_invalid_lines(parse_stream(stream)): + if mapping.key is not None: + yield mapping.key, mapping.value + + def set_as_environment_variables(self) -> bool: + """ + Load the current dotenv as system environment variable. + """ + if not self.dict(): + return False + + for k, v in self.dict().items(): + if k in os.environ and not self.override: + continue + if v is not None: + os.environ[k] = v + + return True + + def get(self, key: str) -> Optional[str]: + """ + """ + data = self.dict() + + if key in data: + return data[key] + + if self.verbose: + logger.warning("Key %s not found in %s.", key, self.dotenv_path) + + return None + + +def get_key( + dotenv_path: StrPath, + key_to_get: str, + encoding: Optional[str] = "utf-8", +) -> Optional[str]: + """ + Get the value of a given key from the given .env. + + Returns `None` if the key isn't found or doesn't have a value. + """ + return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get) + + +@contextmanager +def rewrite( + path: StrPath, + encoding: Optional[str], +) -> Iterator[Tuple[IO[str], IO[str]]]: + pathlib.Path(path).touch() + + with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest: + error = None + try: + with open(path, encoding=encoding) as source: + yield (source, dest) + except BaseException as err: + error = err + + if error is None: + shutil.move(dest.name, path) + else: + os.unlink(dest.name) + raise error from None + + +def set_key( + dotenv_path: StrPath, + key_to_set: str, + value_to_set: str, + quote_mode: str = "always", + export: bool = False, + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str, str]: + """ + Adds or Updates a key/value to the given .env + + If the .env path given doesn't exist, fails instead of risking creating + an orphan .env somewhere in the filesystem + """ + if quote_mode not in ("always", "auto", "never"): + raise ValueError(f"Unknown quote_mode: {quote_mode}") + + quote = ( + quote_mode == "always" + or (quote_mode == "auto" and not value_to_set.isalnum()) + ) + + if quote: + value_out = "'{}'".format(value_to_set.replace("'", "\\'")) + else: + value_out = value_to_set + if export: + line_out = f'export {key_to_set}={value_out}\n' + else: + line_out = f"{key_to_set}={value_out}\n" + + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + replaced = False + missing_newline = False + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_set: + dest.write(line_out) + replaced = True + else: + dest.write(mapping.original.string) + missing_newline = not mapping.original.string.endswith("\n") + if not replaced: + if missing_newline: + dest.write("\n") + dest.write(line_out) + + return True, key_to_set, value_to_set + + +def unset_key( + dotenv_path: StrPath, + key_to_unset: str, + quote_mode: str = "always", + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str]: + """ + Removes a given key from the given `.env` file. + + If the .env path given doesn't exist, fails. + If the given key doesn't exist in the .env, fails. + """ + if not os.path.exists(dotenv_path): + logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path) + return None, key_to_unset + + removed = False + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_unset: + removed = True + else: + dest.write(mapping.original.string) + + if not removed: + logger.warning("Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path) + return None, key_to_unset + + return removed, key_to_unset + + +def resolve_variables( + values: Iterable[Tuple[str, Optional[str]]], + override: bool, +) -> Mapping[str, Optional[str]]: + new_values: Dict[str, Optional[str]] = {} + + for (name, value) in values: + if value is None: + result = None + else: + atoms = parse_variables(value) + env: Dict[str, Optional[str]] = {} + if override: + env.update(os.environ) # type: ignore + env.update(new_values) + else: + env.update(new_values) + env.update(os.environ) # type: ignore + result = "".join(atom.resolve(env) for atom in atoms) + + new_values[name] = result + + return new_values + + +def _walk_to_root(path: str) -> Iterator[str]: + """ + Yield directories starting from the given directory up to the root + """ + if not os.path.exists(path): + raise IOError('Starting path not found') + + if os.path.isfile(path): + path = os.path.dirname(path) + + last_dir = None + current_dir = os.path.abspath(path) + while last_dir != current_dir: + yield current_dir + parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) + last_dir, current_dir = current_dir, parent_dir + + +def find_dotenv( + filename: str = '.env', + raise_error_if_not_found: bool = False, + usecwd: bool = False, +) -> str: + """ + Search in increasingly higher folders for the given file + + Returns path to the file if found, or an empty string otherwise + """ + + def _is_interactive(): + """ Decide whether this is running in a REPL or IPython notebook """ + try: + main = __import__('__main__', None, None, fromlist=['__file__']) + except ModuleNotFoundError: + return False + return not hasattr(main, '__file__') + + if usecwd or _is_interactive() or getattr(sys, 'frozen', False): + # Should work without __file__, e.g. in REPL or IPython notebook. + path = os.getcwd() + else: + # will work for .py files + frame = sys._getframe() + current_file = __file__ + + while frame.f_code.co_filename == current_file or not os.path.exists( + frame.f_code.co_filename + ): + assert frame.f_back is not None + frame = frame.f_back + frame_filename = frame.f_code.co_filename + path = os.path.dirname(os.path.abspath(frame_filename)) + + for dirname in _walk_to_root(path): + check_path = os.path.join(dirname, filename) + if os.path.isfile(check_path): + return check_path + + if raise_error_if_not_found: + raise IOError('File not found') + + return '' + + +def load_dotenv( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + override: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> bool: + """Parse a .env file and then load all the variables found as environment variables. + + Parameters: + dotenv_path: Absolute or relative path to .env file. + stream: Text stream (such as `io.StringIO`) with .env content, used if + `dotenv_path` is `None`. + verbose: Whether to output a warning the .env file is missing. + override: Whether to override the system environment variables with the variables + from the `.env` file. + encoding: Encoding to be used to read the file. + Returns: + Bool: True if at least one environment variable is set else False + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file. + """ + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + dotenv = DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=override, + encoding=encoding, + ) + return dotenv.set_as_environment_variables() + + +def dotenv_values( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> Dict[str, Optional[str]]: + """ + Parse a .env file and return its content as a dict. + + The returned dict will have `None` values for keys without values in the .env file. + For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in + `{"foo": None}` + + Parameters: + dotenv_path: Absolute or relative path to the .env file. + stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. + verbose: Whether to output a warning if the .env file is missing. + encoding: Encoding to be used to read the file. + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file. + """ + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + return DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=True, + encoding=encoding, + ).dict() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/parser.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/parser.py new file mode 100644 index 00000000..735f14a3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/parser.py @@ -0,0 +1,175 @@ +import codecs +import re +from typing import (IO, Iterator, Match, NamedTuple, Optional, # noqa:F401 + Pattern, Sequence, Tuple) + + +def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: + return re.compile(string, re.UNICODE | extra_flags) + + +_newline = make_regex(r"(\r\n|\n|\r)") +_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE) +_whitespace = make_regex(r"[^\S\r\n]*") +_export = make_regex(r"(?:export[^\S\r\n]+)?") +_single_quoted_key = make_regex(r"'([^']+)'") +_unquoted_key = make_regex(r"([^=\#\s]+)") +_equal_sign = make_regex(r"(=[^\S\r\n]*)") +_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") +_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') +_unquoted_value = make_regex(r"([^\r\n]*)") +_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") +_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") +_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") +_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") +_single_quote_escapes = make_regex(r"\\[\\']") + + +class Original(NamedTuple): + string: str + line: int + + +class Binding(NamedTuple): + key: Optional[str] + value: Optional[str] + original: Original + error: bool + + +class Position: + def __init__(self, chars: int, line: int) -> None: + self.chars = chars + self.line = line + + @classmethod + def start(cls) -> "Position": + return cls(chars=0, line=1) + + def set(self, other: "Position") -> None: + self.chars = other.chars + self.line = other.line + + def advance(self, string: str) -> None: + self.chars += len(string) + self.line += len(re.findall(_newline, string)) + + +class Error(Exception): + pass + + +class Reader: + def __init__(self, stream: IO[str]) -> None: + self.string = stream.read() + self.position = Position.start() + self.mark = Position.start() + + def has_next(self) -> bool: + return self.position.chars < len(self.string) + + def set_mark(self) -> None: + self.mark.set(self.position) + + def get_marked(self) -> Original: + return Original( + string=self.string[self.mark.chars:self.position.chars], + line=self.mark.line, + ) + + def peek(self, count: int) -> str: + return self.string[self.position.chars:self.position.chars + count] + + def read(self, count: int) -> str: + result = self.string[self.position.chars:self.position.chars + count] + if len(result) < count: + raise Error("read: End of string") + self.position.advance(result) + return result + + def read_regex(self, regex: Pattern[str]) -> Sequence[str]: + match = regex.match(self.string, self.position.chars) + if match is None: + raise Error("read_regex: Pattern not found") + self.position.advance(self.string[match.start():match.end()]) + return match.groups() + + +def decode_escapes(regex: Pattern[str], string: str) -> str: + def decode_match(match: Match[str]) -> str: + return codecs.decode(match.group(0), 'unicode-escape') # type: ignore + + return regex.sub(decode_match, string) + + +def parse_key(reader: Reader) -> Optional[str]: + char = reader.peek(1) + if char == "#": + return None + elif char == "'": + (key,) = reader.read_regex(_single_quoted_key) + else: + (key,) = reader.read_regex(_unquoted_key) + return key + + +def parse_unquoted_value(reader: Reader) -> str: + (part,) = reader.read_regex(_unquoted_value) + return re.sub(r"\s+#.*", "", part).rstrip() + + +def parse_value(reader: Reader) -> str: + char = reader.peek(1) + if char == u"'": + (value,) = reader.read_regex(_single_quoted_value) + return decode_escapes(_single_quote_escapes, value) + elif char == u'"': + (value,) = reader.read_regex(_double_quoted_value) + return decode_escapes(_double_quote_escapes, value) + elif char in (u"", u"\n", u"\r"): + return u"" + else: + return parse_unquoted_value(reader) + + +def parse_binding(reader: Reader) -> Binding: + reader.set_mark() + try: + reader.read_regex(_multiline_whitespace) + if not reader.has_next(): + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=False, + ) + reader.read_regex(_export) + key = parse_key(reader) + reader.read_regex(_whitespace) + if reader.peek(1) == "=": + reader.read_regex(_equal_sign) + value: Optional[str] = parse_value(reader) + else: + value = None + reader.read_regex(_comment) + reader.read_regex(_end_of_line) + return Binding( + key=key, + value=value, + original=reader.get_marked(), + error=False, + ) + except Error: + reader.read_regex(_rest_of_line) + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=True, + ) + + +def parse_stream(stream: IO[str]) -> Iterator[Binding]: + reader = Reader(stream) + while reader.has_next(): + yield parse_binding(reader) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/py.typed b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/py.typed new file mode 100644 index 00000000..7632ecf7 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/variables.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/variables.py new file mode 100644 index 00000000..667f2f26 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/variables.py @@ -0,0 +1,86 @@ +import re +from abc import ABCMeta, abstractmethod +from typing import Iterator, Mapping, Optional, Pattern + +_posix_variable: Pattern[str] = re.compile( + r""" + \$\{ + (?P[^\}:]*) + (?::- + (?P[^\}]*) + )? + \} + """, + re.VERBOSE, +) + + +class Atom(metaclass=ABCMeta): + def __ne__(self, other: object) -> bool: + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + return not result + + @abstractmethod + def resolve(self, env: Mapping[str, Optional[str]]) -> str: ... + + +class Literal(Atom): + def __init__(self, value: str) -> None: + self.value = value + + def __repr__(self) -> str: + return f"Literal(value={self.value})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return self.value == other.value + + def __hash__(self) -> int: + return hash((self.__class__, self.value)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + return self.value + + +class Variable(Atom): + def __init__(self, name: str, default: Optional[str]) -> None: + self.name = name + self.default = default + + def __repr__(self) -> str: + return f"Variable(name={self.name}, default={self.default})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return (self.name, self.default) == (other.name, other.default) + + def __hash__(self) -> int: + return hash((self.__class__, self.name, self.default)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + default = self.default if self.default is not None else "" + result = env.get(self.name, default) + return result if result is not None else "" + + +def parse_variables(value: str) -> Iterator[Atom]: + cursor = 0 + + for match in _posix_variable.finditer(value): + (start, end) = match.span() + name = match["name"] + default = match["default"] + + if start > cursor: + yield Literal(value=value[cursor:start]) + + yield Variable(name=name, default=default) + cursor = end + + length = len(value) + if cursor < length: + yield Literal(value=value[cursor:length]) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/version.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/version.py new file mode 100644 index 00000000..5c4105cd --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/dotenv/version.py @@ -0,0 +1 @@ +__version__ = "1.0.1" diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/INSTALLER b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/LICENSE.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/LICENSE.txt new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/METADATA b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/METADATA new file mode 100644 index 00000000..c49ceb9a --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/METADATA @@ -0,0 +1,81 @@ +Metadata-Version: 2.3 +Name: Flask +Version: 3.1.0 +Summary: A simple framework for building complex web applications. +Maintainer-email: Pallets +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Typing :: Typed +Requires-Dist: Werkzeug>=3.1 +Requires-Dist: Jinja2>=3.1.2 +Requires-Dist: itsdangerous>=2.2 +Requires-Dist: click>=8.1.3 +Requires-Dist: blinker>=1.9 +Requires-Dist: importlib-metadata>=3.6; python_version < '3.10' +Requires-Dist: asgiref>=3.2 ; extra == "async" +Requires-Dist: python-dotenv ; extra == "dotenv" +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/flask/ +Provides-Extra: async +Provides-Extra: dotenv + +# Flask + +Flask is a lightweight [WSGI][] web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around [Werkzeug][] +and [Jinja][], and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +[WSGI]: https://wsgi.readthedocs.io/ +[Werkzeug]: https://werkzeug.palletsprojects.com/ +[Jinja]: https://jinja.palletsprojects.com/ + + +## A Simple Example + +```python +# save this as app.py +from flask import Flask + +app = Flask(__name__) + +@app.route("/") +def hello(): + return "Hello, World!" +``` + +``` +$ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + + +## Donate + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/RECORD b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/RECORD new file mode 100644 index 00000000..01a900ac --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/RECORD @@ -0,0 +1,58 @@ +../../../bin/flask,sha256=CEKyE140QjKSCNXgcx---v_7OTYC-xi6hEz2jwt_ACE,252 +flask-3.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask-3.1.0.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask-3.1.0.dist-info/METADATA,sha256=Wvf66xwUclGRu89cNcvErpaMf1rMgcxeqIkTc4EmD90,2718 +flask-3.1.0.dist-info/RECORD,, +flask-3.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask-3.1.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +flask-3.1.0.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 +flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-312.pyc,, +flask/__pycache__/__main__.cpython-312.pyc,, +flask/__pycache__/app.cpython-312.pyc,, +flask/__pycache__/blueprints.cpython-312.pyc,, +flask/__pycache__/cli.cpython-312.pyc,, +flask/__pycache__/config.cpython-312.pyc,, +flask/__pycache__/ctx.cpython-312.pyc,, +flask/__pycache__/debughelpers.cpython-312.pyc,, +flask/__pycache__/globals.cpython-312.pyc,, +flask/__pycache__/helpers.cpython-312.pyc,, +flask/__pycache__/logging.cpython-312.pyc,, +flask/__pycache__/sessions.cpython-312.pyc,, +flask/__pycache__/signals.cpython-312.pyc,, +flask/__pycache__/templating.cpython-312.pyc,, +flask/__pycache__/testing.cpython-312.pyc,, +flask/__pycache__/typing.cpython-312.pyc,, +flask/__pycache__/views.cpython-312.pyc,, +flask/__pycache__/wrappers.cpython-312.pyc,, +flask/app.py,sha256=GE7QOE_N9THDjuzKx0gUI9aF4hLh0xwBDa7hLVsjy-o,61725 +flask/blueprints.py,sha256=p5QE2lY18GItbdr_RKRpZ8Do17g0PvQGIgZkSUDhX2k,4541 +flask/cli.py,sha256=XdmkBD74SnT0jrt2gqyHrE9oXGdWlcdTrJQR-i5aApY,37093 +flask/config.py,sha256=PiqF0DPam6HW0FH4CH1hpXTBe30NSzjPEOwrz1b6kt0,13219 +flask/ctx.py,sha256=4atDhJJ_cpV1VMq4qsfU4E_61M1oN93jlS2H9gjrl58,15120 +flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080 +flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 +flask/helpers.py,sha256=7njmzkFJvrPSQudsgONsgQzaGrGppeBINevKgWescPk,23521 +flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602 +flask/json/__pycache__/__init__.cpython-312.pyc,, +flask/json/__pycache__/provider.cpython-312.pyc,, +flask/json/__pycache__/tag.cpython-312.pyc,, +flask/json/provider.py,sha256=5imEzY5HjV2HoUVrQbJLqXCzMNpZXfD0Y1XqdLV2XBA,7672 +flask/json/tag.py,sha256=DhaNwuIOhdt2R74oOC9Y4Z8ZprxFYiRb5dUP5byyINw,9281 +flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 +flask/sansio/__pycache__/app.cpython-312.pyc,, +flask/sansio/__pycache__/blueprints.cpython-312.pyc,, +flask/sansio/__pycache__/scaffold.cpython-312.pyc,, +flask/sansio/app.py,sha256=Wj9NVGtiR1jvkZ9gSFd91usUlM8H0g06aPVz2sMh4bw,38116 +flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637 +flask/sansio/scaffold.py,sha256=q6wM4Y4aYMGGN_Litsj3PYKpBS3Zvut0xhDmpBEHFdo,30387 +flask/sessions.py,sha256=pImSFQIDCPtV-XSI8ttAyTTbvtRMkhDeqJ8VPZZUaf0,15430 +flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 +flask/templating.py,sha256=2TcXLT85Asflm2W9WOSFxKCmYn5e49w_Jkg9-NaaJWo,7537 +flask/testing.py,sha256=5Dxg6VZ0ZPhjwG9ReUl4TrhvkjBYvgIzV949jkY0jIU,10100 +flask/typing.py,sha256=b7mMBIeAoOcAI_vFzzhfOm7KeZ_n868SIMw6xpX5KYQ,3166 +flask/views.py,sha256=xzJx6oJqGElThtEghZN7ZQGMw5TDFyuRxUkecwRuAoA,6962 +flask/wrappers.py,sha256=jUkv4mVek2Iq4hwxd4RvqrIMb69Bv0PElDgWLmd5ORo,9406 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/REQUESTED b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/WHEEL b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/WHEEL new file mode 100644 index 00000000..e3c6feef --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.10.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/entry_points.txt b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/entry_points.txt new file mode 100644 index 00000000..eec6733e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask-3.1.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask=flask.cli:main + diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__init__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__init__.py new file mode 100644 index 00000000..e86eb43e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__init__.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import typing as t + +from . import json as json +from .app import Flask as Flask +from .blueprints import Blueprint as Blueprint +from .config import Config as Config +from .ctx import after_this_request as after_this_request +from .ctx import copy_current_request_context as copy_current_request_context +from .ctx import has_app_context as has_app_context +from .ctx import has_request_context as has_request_context +from .globals import current_app as current_app +from .globals import g as g +from .globals import request as request +from .globals import session as session +from .helpers import abort as abort +from .helpers import flash as flash +from .helpers import get_flashed_messages as get_flashed_messages +from .helpers import get_template_attribute as get_template_attribute +from .helpers import make_response as make_response +from .helpers import redirect as redirect +from .helpers import send_file as send_file +from .helpers import send_from_directory as send_from_directory +from .helpers import stream_with_context as stream_with_context +from .helpers import url_for as url_for +from .json import jsonify as jsonify +from .signals import appcontext_popped as appcontext_popped +from .signals import appcontext_pushed as appcontext_pushed +from .signals import appcontext_tearing_down as appcontext_tearing_down +from .signals import before_render_template as before_render_template +from .signals import got_request_exception as got_request_exception +from .signals import message_flashed as message_flashed +from .signals import request_finished as request_finished +from .signals import request_started as request_started +from .signals import request_tearing_down as request_tearing_down +from .signals import template_rendered as template_rendered +from .templating import render_template as render_template +from .templating import render_template_string as render_template_string +from .templating import stream_template as stream_template +from .templating import stream_template_string as stream_template_string +from .wrappers import Request as Request +from .wrappers import Response as Response + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Flask 3.1. Use feature detection or" + " 'importlib.metadata.version(\"flask\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("flask") + + raise AttributeError(name) diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__main__.py b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__main__.py new file mode 100644 index 00000000..4e28416e --- /dev/null +++ b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__main__.py @@ -0,0 +1,3 @@ +from .cli import main + +main() diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84e94b9ef464158a65afc293a33e18c30e2fd280 GIT binary patch literal 2482 zcmZXWOK%iM5XXD=HTz(__WJ$69zWM>!!EYT3s4dVNP-k|0HR2(NTcyi@9x<1qNmr! z$VgF?NXaRO9N;4)BHttz2nW!hks^^Ce6xg4oKn@^0m~VU{`>3dp6=?Z>el{QEanM3 zU#%Uq)`4DOBYqOcpu9d(2zf|MVk$Oq6sjo52|GcPX3|XADJM) zFVaQH)4)|)l{^EyM3*Gb0x#2L$#cNx=sC&r_Iam9Ymyg$>$EPp0(^m9kh}=ILRTbL z?Nw)uu1Q`3zDO?upEH+#NYVH964mnuSOQfgEEulq2}4+(8{9mAazJBhEAU+SO@D41 z!8SndGrPllZn**)nX8`Lv|2!AqbV5IMcWE=&hBC0#SfC-xnQ3v>zOo-_;23`gI!MEk@p)DE}xrpIA~ih;G7IJgh?)QySmd%n-i)5cEFmd4=| zBLy=c3oYIBc5&N7n+zsKr(F{h(cKpG47R*?v1j)h%*PZ%N2wc&I5uGFjU(T*T&ufi zDYgZ|;6nN_5Svap(HAe#3n_)rMcNoVC)^(0|^8H`$w3${p zVXkOzD^#-r&4fe98c?{VX1J!dYuUE8$u!O!ZwG9atH~3qt<_d)+SdWon#>R#&fr4< zbqp(M9@i?Cl zW!qIXEdPJ1FuQAT7ZMwUDWtG`t?M-`|IKk%n2i?>)$Yn+&w6|ouX7HkB^jn%!(n0W z?Gk(yJP9xznx?(^whkNQL7iZs4N8;6rXM!;&>z`!>jTA_#>#LMjT%k1#q+1_7@KNk-ZiQ=cqQHB(!UJQ>M7D#UBh-7m4!yeK*`n)v#v^4#^ zRDD{i{#JQbT78mT{U<;2Xy93X@=0p)HB3vYDgGh+gh{CUFvA(-&Ap!%wRLx|`hJ+# z^=1cC3GQG7!i?DSA;_U3Lc+0(!zA1j97{LMZ^qYkz*RXIZW_30b22gLCo z0>|>@XRt$U+1{pM2OKMw_n?$edSz#u**?UZ_o1nb(vLELGKeySGK?~UGKw;WG7b`| zfz@(x@(DDZMVUmILeWsBQD#tPQRYzQLBf3ZUV!cL1+-RB;7Ai*#s2IrhpnS;OK4k0 z!Ib?@_!Z|?$GO+1~!k06IhMNuL$^NN)JC1VkpibyRYa}oI{A{!A| zi^%1O)FUz;k&1k0BLeSwM6S!;YDAVJ@`-$50DK7J;r&7mxEhfU|N!2Y#OwLYB zPc7C@%SkNG){l<|Sr#9!S5Wzj!zMRBr8Fniu80F@8OSlkyg=duGb1D8T?WyI3@oi| IMQlJ30D#Us(EtDd literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d72362e2b7f8a87e84c8867ee9c37de8d6e5f31 GIT binary patch literal 62487 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 HmEAuA!vaIh literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b68c95f56dd594062711d2621dd7d85f5b449ac GIT binary patch literal 5002 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 literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56e77a9382437a18e228cca0e1dc9d61d563948f GIT binary patch literal 43405 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 Uaobq>fnfRiPKd&UG6u{4Kc;R~WB>pF literal 0 HcmV?d00001 diff --git a/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc b/Domains/FullStack/MiniProjects/QuizMaster/venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26e6258c8e79c41e90d2de42534e1d7504fc128c GIT binary patch literal 16254 zcmd5@Yiu0Xb)MPX*$3ZmQ4dOE>On4TE-lIRgO+Sl6eUxZNJXTbh>E;B+!>NfEqCde zSy7~yiIceXDo|=FP9ZwBVHqtN8!}M0C{PzI(8>*v7X4AFQXzWm0&0`|$iI!Hz^U@5 z-??{Yc9x=IH$Z?6!P%MnIQQIh&pppO|5{yLA>cZ^`xldcx?2!_N-xe8`T9kgZy7hRu