From 39ecf13dc3681bfc192be4ee84a1e59f16ef080f Mon Sep 17 00:00:00 2001 From: Colin Sullivan Date: Sat, 2 Dec 2023 00:48:37 -0500 Subject: [PATCH] 2023 Day 1 and reorganization (#1) * clean for 2023 * 2023 day 1 complete --- .devcontainer/devcontainer.json | 12 +- .flake8 | 2 - .github/ISSUE_TEMPLATE/bug_report.md | 34 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/release-drafter.yml | 29 + .github/workflows/CI.yml | 108 + .github/workflows/release.yml | 113 + .gitignore | 7 +- .pre-commit-config.yaml | 25 + Makefile | 89 + README.md | 31 +- archive/2021/src/advent_of_code/day5/part1.py | 4 +- archive/2021/tests/test_day3.py | 1 - archive/2021/tests/test_day4.py | 1 - archive/2021/tests/test_day6.py | 1 - archive/2022/.devcontainer/devcontainer.json | 19 + archive/2022/README.md | 22 + archive/2022/data/day1.txt | 2242 ++++++++++++ {data => archive/2022/data}/day10.txt | 0 {data => archive/2022/data}/day2.txt | 0 {data => archive/2022/data}/day3.txt | 0 {data => archive/2022/data}/day4.txt | 0 {data => archive/2022/data}/day5.txt | 0 {data => archive/2022/data}/day6.txt | 0 {data => archive/2022/data}/day7.txt | 0 {data => archive/2022/data}/day8.txt | 0 {data => archive/2022/data}/day9.txt | 0 archive/2022/poetry.lock | 533 +++ archive/2022/pyproject.toml | 28 + .../2022/src}/advent_of_code/__init__.py | 0 .../2022/src}/advent_of_code/day1/__init__.py | 0 .../2022/src}/advent_of_code/day1/part1.py | 0 .../2022/src}/advent_of_code/day1/part2.py | 0 .../src}/advent_of_code/day10/__init__.py | 0 .../2022/src}/advent_of_code/day10/part1.py | 0 .../2022/src}/advent_of_code/day10/part2.py | 0 .../2022/src}/advent_of_code/day2/__init__.py | 0 .../2022/src}/advent_of_code/day2/part1.py | 0 .../2022/src}/advent_of_code/day2/part2.py | 0 .../2022/src}/advent_of_code/day3/__init__.py | 0 .../2022/src}/advent_of_code/day3/part1.py | 0 .../2022/src}/advent_of_code/day3/part2.py | 0 .../2022/src}/advent_of_code/day4/__init__.py | 0 .../2022/src}/advent_of_code/day4/part1.py | 0 .../2022/src}/advent_of_code/day4/part2.py | 0 .../2022/src}/advent_of_code/day5/__init__.py | 0 .../2022/src}/advent_of_code/day5/part1.py | 0 .../2022/src}/advent_of_code/day5/part2.py | 0 .../2022/src}/advent_of_code/day6/__init__.py | 0 .../2022/src}/advent_of_code/day6/part1.py | 0 .../2022/src}/advent_of_code/day6/part2.py | 0 .../2022/src}/advent_of_code/day7/__init__.py | 0 .../2022/src}/advent_of_code/day7/part1.py | 0 .../2022/src}/advent_of_code/day7/part2.py | 0 .../2022/src}/advent_of_code/day8/__init__.py | 0 .../2022/src}/advent_of_code/day8/part1.py | 0 .../2022/src}/advent_of_code/day8/part2.py | 0 .../2022/src}/advent_of_code/day9/__init__.py | 0 .../2022/src}/advent_of_code/day9/part1.py | 0 .../2022/src}/advent_of_code/day9/part2.py | 0 {tests => archive/2022/tests}/conftest.py | 0 archive/2022/tests/test_day1.py | 27 + {tests => archive/2022/tests}/test_day10.py | 0 {tests => archive/2022/tests}/test_day2.py | 0 {tests => archive/2022/tests}/test_day3.py | 0 {tests => archive/2022/tests}/test_day4.py | 0 {tests => archive/2022/tests}/test_day5.py | 0 {tests => archive/2022/tests}/test_day6.py | 0 {tests => archive/2022/tests}/test_day7.py | 0 {tests => archive/2022/tests}/test_day8.py | 0 {tests => archive/2022/tests}/test_day9.py | 0 data/day1.txt | 3240 +++++------------ docs/docs/CLI.md | 89 + docs/docs/day1/part1.md | 1 + docs/docs/day1/part2.md | 1 + docs/docs/images/IMG_5796.JPG | Bin 0 -> 198189 bytes docs/docs/index.md | 42 + docs/docs/js/custom.js | 125 + docs/docs/js/termynal.js | 273 ++ docs/docs/stylesheets/custom.css | 35 + docs/docs/stylesheets/extra.css | 59 + docs/docs/stylesheets/termynal.css | 108 + docs/mkdocs.yml | 57 + poetry.lock | 1801 +++++++-- pyproject.toml | 87 +- src/aoc/__init__.py | 0 src/aoc/cli.py | 107 + src/aoc/day1/__init__.py | 0 src/aoc/day1/part1.py | 50 + src/aoc/day1/part2.py | 72 + tests/test_day1.py | 39 +- 91 files changed, 6905 insertions(+), 2629 deletions(-) delete mode 100644 .flake8 create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/CI.yml create mode 100644 .github/workflows/release.yml create mode 100644 .pre-commit-config.yaml create mode 100644 Makefile create mode 100644 archive/2022/.devcontainer/devcontainer.json create mode 100644 archive/2022/README.md create mode 100644 archive/2022/data/day1.txt rename {data => archive/2022/data}/day10.txt (100%) rename {data => archive/2022/data}/day2.txt (100%) rename {data => archive/2022/data}/day3.txt (100%) rename {data => archive/2022/data}/day4.txt (100%) rename {data => archive/2022/data}/day5.txt (100%) rename {data => archive/2022/data}/day6.txt (100%) rename {data => archive/2022/data}/day7.txt (100%) rename {data => archive/2022/data}/day8.txt (100%) rename {data => archive/2022/data}/day9.txt (100%) create mode 100644 archive/2022/poetry.lock create mode 100644 archive/2022/pyproject.toml rename {src => archive/2022/src}/advent_of_code/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day1/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day1/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day1/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day10/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day10/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day10/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day2/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day2/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day2/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day3/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day3/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day3/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day4/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day4/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day4/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day5/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day5/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day5/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day6/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day6/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day6/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day7/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day7/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day7/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day8/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day8/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day8/part2.py (100%) rename {src => archive/2022/src}/advent_of_code/day9/__init__.py (100%) rename {src => archive/2022/src}/advent_of_code/day9/part1.py (100%) rename {src => archive/2022/src}/advent_of_code/day9/part2.py (100%) rename {tests => archive/2022/tests}/conftest.py (100%) create mode 100644 archive/2022/tests/test_day1.py rename {tests => archive/2022/tests}/test_day10.py (100%) rename {tests => archive/2022/tests}/test_day2.py (100%) rename {tests => archive/2022/tests}/test_day3.py (100%) rename {tests => archive/2022/tests}/test_day4.py (100%) rename {tests => archive/2022/tests}/test_day5.py (100%) rename {tests => archive/2022/tests}/test_day6.py (100%) rename {tests => archive/2022/tests}/test_day7.py (100%) rename {tests => archive/2022/tests}/test_day8.py (100%) rename {tests => archive/2022/tests}/test_day9.py (100%) create mode 100644 docs/docs/CLI.md create mode 100644 docs/docs/day1/part1.md create mode 100644 docs/docs/day1/part2.md create mode 100644 docs/docs/images/IMG_5796.JPG create mode 100644 docs/docs/index.md create mode 100644 docs/docs/js/custom.js create mode 100644 docs/docs/js/termynal.js create mode 100644 docs/docs/stylesheets/custom.css create mode 100644 docs/docs/stylesheets/extra.css create mode 100644 docs/docs/stylesheets/termynal.css create mode 100644 docs/mkdocs.yml create mode 100644 src/aoc/__init__.py create mode 100644 src/aoc/cli.py create mode 100644 src/aoc/day1/__init__.py create mode 100644 src/aoc/day1/part1.py create mode 100644 src/aoc/day1/part2.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d640dd4..76bc057 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,14 +4,22 @@ "name": "Python 3", "image": "mcr.microsoft.com/devcontainers/python:3.11", "features": { - "ghcr.io/devcontainers-contrib/features/poetry:1": {} + "ghcr.io/devcontainers-contrib/features/poetry:2": {} }, // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "poetry config virtualenvs.in-project true && poetry install" + "postCreateCommand": "poetry install", + "customizations": { + "vscode": { + "extensions": [ + "ms-python.python", + "charliermarsh.ruff" + ] + } + }, // Configure tool-specific properties. // "customizations": {}, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 16520fc..0000000 --- a/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -ignore = E501 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..3b3e592 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,34 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'bug' +assignees: '' + +--- + +## Describe the bug +A clear and concise description of what the bug is. + +## To Reproduce + +### Environment +Output of `aoc debug-version-info`: +``` +... +``` + +### Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior +A clear and concise description of what you expected to happen. + +## Screenshots +If applicable, add screenshots to help explain your problem. + +## Additional context +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..adb7ce6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'enhancement' +assignees: '' + +--- + +### Is your feature request related to a problem? Please describe. +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +### Describe the solution you'd like +A clear and concise description of what you want to happen. + +### Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've considered. + +### Additional context +Add any other context or screenshots about the feature request here. diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 0000000..7a04410 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,29 @@ +categories: + - title: ":boom: Breaking Changes" + label: "breaking" + - title: ":rocket: Features" + label: "enhancement" + - title: ":fire: Removals and Deprecations" + label: "removal" + - title: ":beetle: Fixes" + label: "bug" + - title: ":racehorse: Performance" + label: "performance" + - title: ":rotating_light: Testing" + label: "testing" + - title: ":construction_worker: Continuous Integration" + label: "ci" + - title: ":books: Documentation" + label: "documentation" + - title: ":hammer: Refactoring" + label: "refactoring" + - title: ":lipstick: Style" + label: "style" + - title: ":package: Dependencies" + labels: + - "dependencies" + - "build" +template: | + ## Changes + + $CHANGES diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..2cb0ad2 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,108 @@ +# This workflow will install Python dependencies, run tests and lint. +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + checks: + name: Code Quality Checks + runs-on: ubuntu-latest + steps: + + - name: Install poetry + run: | + pipx install poetry + + - name: Chekout Repo + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "poetry" + + - name: Install dependencies + run: | + poetry env use 3.11 + poetry config installer.modern-installation false + poetry install + + - name: Verify formatting + run: | + poetry run ruff . --select I + poetry run ruff format --check . + + - name: Lint + run: | + poetry run ruff . --exit-zero + poetry run mypy --install-types --non-interactive . + poetry run mypy --html-report=mypy_report . + + - name: "Upload Mypy Report" + uses: actions/upload-artifact@v3 + with: + name: mypy + path: mypy_report + + - name: Build Docs + run: | + make docs + + - name: Upload Docs + uses: actions/upload-artifact@v3 + with: + name: docs + path: docs/site + + - name: Build Wheel + run: | + python -m pip install --upgrade pip + pip install build + python -m build . + + - name: "Upload Distribution" + uses: actions/upload-artifact@v3 + with: + name: dist + path: dist + + - name: Run tests + run: | + poetry run coverage run -m pytest --html=test_report.html --self-contained-html + + - name: "Upload Coverage" + uses: actions/upload-artifact@v3 + with: + name: coverage + path: .coverage.* + + - name: Show Coverage Report + run: | + poetry run coverage combine + poetry run coverage report + + - name: Create HTML report + run: | + poetry run coverage html + + - name: Upload HTML report + uses: actions/upload-artifact@v3 + with: + name: coverage_html + path: htmlcov + + - name: Upload coverage data + uses: actions/upload-artifact@v3 + with: + name: coverage + path: .coverage + + - name: Check minimum coverage + run: | + poetry run coverage report + poetry run echo '## Test Coverage Report' >> $GITHUB_STEP_SUMMARY + poetry run coverage report --format markdown >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..276ddaf --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,113 @@ +name: Release + +on: + workflow_run: + workflows: ["CI"] + branches: [main] + types: + - completed + workflow_dispatch: + +permissions: + contents: write +jobs: + draft-release: + permissions: + contents: write + pull-requests: write + name: Draft Release + runs-on: ubuntu-latest + outputs: + build_assets: ${{ steps.check-version.outputs.tag }} + upload_url: ${{ steps.update-release.outputs.upload_url }} + steps: + - name: Install poetry + run: | + pipx install poetry + + - name: Check out the repository + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "poetry" + + - name: Install dependencies + run: | + poetry env use 3.11 + poetry config installer.modern-installation false + poetry install + + - name: Detect and tag new version + id: check-version + uses: salsify/action-detect-and-tag-new-version@v2.0.3 + with: + version-command: | + bash -o pipefail -c "poetry version | awk '{ print \$2 }'" + + - name: Publish the release notes + id: update-release + uses: release-drafter/release-drafter@v5.21.1 + with: + publish: ${{ steps.check-version.outputs.tag != '' }} + tag: ${{ steps.check-version.outputs.tag }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-release-assets: + name: Build Release Assets + runs-on: ubuntu-latest + needs: draft-release + if: ${{ needs.draft-release.outputs.build_assets != '' }} + steps: + - name: Install poetry + run: | + pipx install poetry + + - name: Check out the repository + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "poetry" + + - name: Install dependencies + run: | + poetry env use 3.11 + poetry config installer.modern-installation false + poetry install + + - name: Build Distribution + run: | + python -m pip install --upgrade pip + pip install build + python -m build . + + - name: Upload Distribution Assets + uses: shogo82148/actions-upload-release-asset@v1 + with: + upload_url: ${{ needs.draft-release.outputs.upload_url }} + asset_path: dist/* + + - name: Build Documentation + run: | + make docs + zip -r docs.zip docs/site + + - name: Upload Documentation Assets + uses: shogo82148/actions-upload-release-asset@v1 + with: + upload_url: ${{ needs.draft-release.outputs.upload_url }} + asset_path: docs.zip + + - name: Publish docs to github pages + run: | + cd docs/; poetry run mkdocs gh-deploy --force \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1df7731..a40c83f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,9 @@ .pytest_cache .vscode htmlcov -.DS_Store \ No newline at end of file +.DS_Store +.venv +.ruff_cache +.coverage +*.html +mypy_report \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..2cb77d3 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,25 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace + exclude: docs/docs/CLI.md + - id: end-of-file-fixer + exclude: docs/docs/CLI.md + - id: check-yaml + - id: check-added-large-files + - id: check-ast + - id: check-merge-conflict + - id: check-toml + - id: debug-statements + - id: detect-private-key + + - repo: https://github.com/charliermarsh/ruff-pre-commit + # Ruff version. + rev: "v0.1.5" + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..390c316 --- /dev/null +++ b/Makefile @@ -0,0 +1,89 @@ +.PHONY: clean clean-test clean-pyc clean-build docs + +## remove all build, test, coverage and Python artifacts +clean: clean-build clean-pyc clean-test docs-clean + +## remove build artifacts +clean-build: + rm -fr build/ + rm -fr dist/ + rm -fr .eggs/ + find . -name '*.egg' -exec rm -f {} + + +## remove Python file artifacts +clean-pyc: + find . -name '*.pyc' -exec rm -f {} + + find . -name '*.pyo' -exec rm -f {} + + find . -name '*~' -exec rm -f {} + + find . -name '__pycache__' -exec rm -fr {} + + rm -rf .mypy_cache/ + rm -rf .ruff_cache + +## remove test and coverage artifacts +clean-test: + rm -fr .tox/ + rm -f .coverage* + rm -fr htmlcov/ + rm -rf mypy_report/ + rm -rf *.html + rm -fr .cache/ + rm -fr .pytest_cache + rm -f coverage.xml + +## fix with ruff +format: + poetry run ruff --select I . --fix + poetry run ruff format . + +## check style with ruff, mypy +lint: + poetry run ruff . --exit-zero --fix + poetry run mypy . + +## run tests with the default Python +test: + poetry run pytest + +## run tests with coverage +coverage: + poetry run coverage run -m pytest + poetry run coverage combine + poetry run coverage report + +## check code coverage and test report with the default Python +test-reports: + poetry run coverage run -m pytest --html=test_report.html --self-contained-html + poetry run coverage combine + poetry run coverage html + poetry run mypy --html-report=mypy_report --install-types --non-interactive src tests + + @echo "Open reports htmlcov/index.html, test_report.html, mypy_report/index.html in your browser" + +## run typer-cli to build the cli markdown docs +cli-docs: + poetry run typer aoc.cli utils docs --name aoc > docs/docs/CLI.md + +## generate Mkdocs HTML documentation +docs: docs-clean cli-docs + cd docs/; poetry run mkdocs build + +## serve docs +serve-docs: docs-clean cli-docs + cd docs/; poetry run mkdocs serve --watch ../src/aoc + +## remove previously build docs +docs-clean: + cd docs/; rm -rf site/; + +## builds source and wheel package +dist: clean + poetry build + +############################################################################## +# Self Documenting Commands # +############################################################################## +.DEFAULT_GOAL := show-help +# See for explanation. +.PHONY: show-help +show-help: + @echo "$$(tput bold)Available rules:$$(tput sgr0)";echo;sed -ne"/^## /{h;s/.*//;:d" -e"H;n;s/^## //;td" -e"s/:.*//;G;s/\\n## /---/;s/\\n/ /g;p;}" ${MAKEFILE_LIST}|LC_ALL='C' sort -f|awk -F --- -v n=$$(tput cols) -v i=19 -v a="$$(tput setaf 6)" -v z="$$(tput sgr0)" '{printf"%s%*s%s ",a,-i,$$1,z;m=split($$2,w," ");l=n-i;for(j=1;j<=m;j++){l-=length(w[j])+1;if(l<= 0){l=n-i-length(w[j])-1;printf"\n%*s ",-i," ";}printf"%s ",w[j];}printf"\n";}' diff --git a/README.md b/README.md index 5767634..b6f8809 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,34 @@ -# Repo for Advent of Code 2022 +# Advent of Code 2023 + +[![CI](https://github.com/sullivancolin/advent_of_code/actions/workflows/CI.yml/badge.svg)](https://github.com/sullivancolin/advent_of_code/actions) + +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/sullivancolin/advent_of_code) +[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) + +[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/sullivancolin/advent-of-code) + +My record of current and past attempts at Advent of Code in Python. (I usually Peter out around the second week as they take more time and I'm spending more time with family.) ## Installation ### Using the `devcontainter` -Clone the repo and open in [VScode](https://code.visualstudio.com/). VScode will recognize the presence of devcontainer configuration and prompt you reopen the repository inside the container after building the Docker Image. +Click the button above to launch into Codespaces, or clone the repo and open in [VScode](https://code.visualstudio.com/). VScode will recognize the presence of devcontainer configuration and prompt you reopen the repository inside the container after building the Docker Image. ### Manually -Before installing dependencies please make sure you have an accessible distribution of python 3.11 available and installed [poetry](https://python-poetry.org/). To install dependencies create a new virtual environment and install with `poetry install` +Before installing dependencies please make sure you have an accessible distribution of python 3.11 available and installed [poetry](https://python-poetry.org/). To create a new virtual environment and install all dependencies run +```sh +$ poetry install +``` ## Running the solutions -The solutions for each day will be in its own package with one module for each part. All input data will be in the `data` directory labeled by day. The `tests` directory contains one module for each day with tests for both parts. The solution for each part can be printed by run each module as a script. For example to get the solution to Day 1, Part 1, run -```shell -$ python -m advent_of_code.day1.part1 +The solutions for each day will be in its own sub package of the top level `aoc` package with one module for each part. All input data will be in the `data` directory labeled by day. The `tests` directory contains one module for each day with tests for both parts. The solution for each part can be printed by runing the include command line interface `aoc` with each day and part as subcommands. For example to get the solution to Day 1, Part 1, run +```sh +$ poetry run aoc day1 part1 data/day1.txt +``` + +To get more information on how to use the CLI just append `--help` to the command for example: +```sh +$ poetry run aoc --help ``` ## Runing the tests @@ -20,3 +37,5 @@ Each day has its own tests using the provided example input data. To run the te To run tests for a single day run `pytest tests/test_day1.py` +## Documentation +Documentation is provided via `mkdocs-material` and `mkdocstrings` and are generated from the source code, and host on github pages. \ No newline at end of file diff --git a/archive/2021/src/advent_of_code/day5/part1.py b/archive/2021/src/advent_of_code/day5/part1.py index 919a54d..63d10c3 100644 --- a/archive/2021/src/advent_of_code/day5/part1.py +++ b/archive/2021/src/advent_of_code/day5/part1.py @@ -80,9 +80,9 @@ def update_grid(grid: np.ndarray, p1: Point, p2: Point) -> np.ndarray: if p1.x != p2.x and p1.y != p2.y: return grid if p1.x == p2.x: - grid[p1.x, p1.y : p2.y + 1] += 1 # noqa + grid[p1.x, p1.y : p2.y + 1] += 1 else: - grid[p1.x : p2.x + 1, p1.y] += 1 # noqa + grid[p1.x : p2.x + 1, p1.y] += 1 return grid diff --git a/archive/2021/tests/test_day3.py b/archive/2021/tests/test_day3.py index 690d621..e48e1f6 100644 --- a/archive/2021/tests/test_day3.py +++ b/archive/2021/tests/test_day3.py @@ -1,5 +1,4 @@ import pytest - from advent_of_code.day3.part1 import get_pressure from advent_of_code.day3.part2 import get_life_support diff --git a/archive/2021/tests/test_day4.py b/archive/2021/tests/test_day4.py index 1131f02..9afb799 100644 --- a/archive/2021/tests/test_day4.py +++ b/archive/2021/tests/test_day4.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from advent_of_code.day4.part1 import ( check_columns, check_rows, diff --git a/archive/2021/tests/test_day6.py b/archive/2021/tests/test_day6.py index 7d4ccab..7cce1b6 100644 --- a/archive/2021/tests/test_day6.py +++ b/archive/2021/tests/test_day6.py @@ -1,4 +1,3 @@ -from unittest.mock import NonCallableMagicMock from advent_of_code.day6.part1 import fish_after_interval diff --git a/archive/2022/.devcontainer/devcontainer.json b/archive/2022/.devcontainer/devcontainer.json new file mode 100644 index 0000000..d640dd4 --- /dev/null +++ b/archive/2022/.devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/python +{ + "name": "Python 3", + "image": "mcr.microsoft.com/devcontainers/python:3.11", + "features": { + "ghcr.io/devcontainers-contrib/features/poetry:1": {} + }, + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "poetry config virtualenvs.in-project true && poetry install" + // Configure tool-specific properties. + // "customizations": {}, + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} \ No newline at end of file diff --git a/archive/2022/README.md b/archive/2022/README.md new file mode 100644 index 0000000..5767634 --- /dev/null +++ b/archive/2022/README.md @@ -0,0 +1,22 @@ +# Repo for Advent of Code 2022 + +## Installation + +### Using the `devcontainter` +Clone the repo and open in [VScode](https://code.visualstudio.com/). VScode will recognize the presence of devcontainer configuration and prompt you reopen the repository inside the container after building the Docker Image. + +### Manually +Before installing dependencies please make sure you have an accessible distribution of python 3.11 available and installed [poetry](https://python-poetry.org/). To install dependencies create a new virtual environment and install with `poetry install` + +## Running the solutions +The solutions for each day will be in its own package with one module for each part. All input data will be in the `data` directory labeled by day. The `tests` directory contains one module for each day with tests for both parts. The solution for each part can be printed by run each module as a script. For example to get the solution to Day 1, Part 1, run +```shell +$ python -m advent_of_code.day1.part1 +``` + +## Runing the tests +Each day has its own tests using the provided example input data. To run the tests for all days run `pytest` from the root directory. + +To run tests for a single day run `pytest tests/test_day1.py` + + diff --git a/archive/2022/data/day1.txt b/archive/2022/data/day1.txt new file mode 100644 index 0000000..c6e33b0 --- /dev/null +++ b/archive/2022/data/day1.txt @@ -0,0 +1,2242 @@ +2936 +2154 +1578 +4820 +5674 +5582 +2392 +6148 +1276 +1783 +2572 +5067 +3526 + +1673 +10546 + +1036 +2765 +2244 +1018 +2363 +6858 +4640 +2614 +2660 +4411 +1118 +6887 + +3965 +3978 +3991 +8557 +3150 +3801 +5310 +1991 +8961 + +8526 +2340 +4983 +3750 +3471 +1564 +4638 +7198 +3127 +5522 + +5417 +3737 +7464 +2219 +5174 +2873 +1650 +3044 +6290 +2640 +5499 + +1946 +3463 +7792 +6268 +2608 +5922 +3812 +2292 +5730 +5798 +2785 + +15448 +14133 +15280 + +32925 +9977 + +31033 +36925 + +7793 +4374 +3042 +3900 +7160 +7472 +6251 +1866 +7489 + +6884 +7643 +3926 +3857 +3326 +7619 +2831 +8489 +8212 + +8447 +1468 +1100 +6492 +9151 +2144 +6579 +1951 +9223 + +28622 + +4166 +2686 +7394 +2773 +5777 +5734 +1164 +1916 +4040 +7119 +1986 +5178 + +3920 +11406 +1982 +1596 +2852 +9750 +5758 + +4860 +10579 +5897 +9117 +2767 +10259 +8488 +1120 + +11037 +16409 + +3114 +5793 +9778 +5873 +4201 +11491 +3555 + +1793 +9922 +21194 + +3578 +4113 +4094 +7777 +4623 +4349 +5554 +8046 +6099 +2934 + +18520 +22405 +22499 + +3978 +20163 +16656 + +4073 +4198 +2156 +5691 +4071 +7596 +5628 +7557 +6776 +3796 + +10611 +1321 +2692 +8966 +1069 +3168 +11061 + +2025 +6601 +2981 +3962 +5499 +3940 +1548 +2094 +5794 +6120 +6393 +5493 +3611 + +2539 +2894 +7029 +7277 +1467 +3123 +6152 +1023 +6351 +6054 +5440 + +2877 +5142 +4862 +4155 +3692 +7854 +6712 +1462 +7198 +1111 +1548 + +3246 +19782 + +13975 +11522 +12604 +1220 +4652 + +1860 +2373 +3595 +6084 +5099 +3484 +5828 +2102 +5249 +3382 +3129 +3963 +2298 + +7770 +4139 +1491 +3495 +5239 +9025 +1745 +2254 +9599 + +20903 + +1009 +3131 +3866 +9099 +9002 +2730 +7083 +4350 +1239 + +61041 + +59008 + +6746 +5100 +2503 +1809 +5988 +6011 +1652 +1291 +4348 +6322 +1982 +4321 + +4090 +7038 +6586 +4222 +8733 +5201 +5132 +5260 +2548 + +5959 +6803 +1420 +4281 +1380 +1566 +6317 +3029 +4666 +4459 +4039 +4104 + +14286 +13187 +11293 +6804 +9011 + +4002 +13481 +6528 +14618 + +5247 +9496 +2951 +8130 +4237 +7737 + +9223 +12089 +12087 +7816 +9441 +10626 + +5465 +3972 +8692 +13696 +11295 + +9724 +17909 +23253 + +3418 +3116 +5056 +1656 +5994 +3336 +4612 +3063 +6783 +2118 +4666 +1343 +5492 + +3910 +4692 +1113 +1799 +5139 +3531 +4893 +2612 +5573 +3298 +1612 +4609 +3372 + +1787 +1838 +2569 +2437 +3770 +2197 +3144 +5940 +6248 +4953 +4674 +3697 +4926 +2660 + +6814 +2923 +1517 +2468 +6726 +2925 +4728 +4433 +6343 +4225 +4081 +4445 +3555 + +6727 +5809 +10250 +7025 +9307 +1102 +7950 + +5769 +5786 +3105 +1538 +1836 +2025 +5583 +1900 +2558 +2418 +3541 +2765 +2474 +4071 + +3368 +6393 +4684 +4010 +7804 +8291 +8889 +2384 +6981 + +2112 +4039 +6338 +2628 +5228 +3427 +1788 +5138 +1891 +4216 +5905 +5629 +4588 + +42033 + +57235 + +3821 +5741 +4265 +2601 +5218 +3592 +1816 +1199 +3577 +4657 +1068 +5495 +1614 +3586 +1894 + +3638 +3088 +6292 +2293 +5310 +5129 +4082 +3982 +2596 +2252 +4279 +5800 +4607 + +5351 +13793 +10195 +5951 +9105 +9951 + +4126 +3798 +1905 +5413 +1956 +2246 +3559 +3993 +2447 +2600 +1478 +5856 +5595 +1416 +3749 + +5758 +2495 +1185 +5261 +4898 +6858 +3304 +5540 +6718 +6596 +4806 +3161 +2222 + +5011 +7613 +8709 +7915 +6889 +12127 +8855 + +3479 +5863 +9234 +9019 +13582 +2978 + +10216 +13081 +5805 +3791 + +6591 +1319 +1901 +6087 +6769 +5230 +3857 +1690 +1471 +6775 +4204 +2166 +1192 + +6571 +9490 +3259 +2326 +5084 +8723 +10744 +8363 + +5693 +5198 +3911 +2606 +3996 +1377 +1248 +5244 +3169 +6347 +4885 +4255 +6175 + +7476 +1656 +24309 + +3801 +5855 +2015 +2516 +1313 +3658 +5344 +2769 +3269 +3797 +6851 +7192 + +1254 +1999 +3039 +5211 +2624 +6505 +3214 +6949 +7036 +7926 +2469 + +17404 +21131 +13342 + +3789 +5360 +2709 +4535 +5734 +5686 +3180 +1711 +1719 +3476 +1747 +3526 +3642 +3528 +2035 + +5978 +6149 +7455 +2176 +6878 +2191 +1291 + +2498 +7020 +7297 +4930 +1920 +6770 +4661 +4429 +1639 +5593 +4552 +6441 + +1804 +8012 +2515 +4692 +3062 +2261 +6532 +6486 +3061 +4968 +1284 + +3640 +9961 +4058 +3247 +12036 +5775 + +5253 +5478 +2337 +5508 +4905 +5950 +5556 +1425 +5441 +2823 +5915 +2901 + +5247 +4417 +1117 +3120 +5747 +1237 +4181 +5554 +3357 +1711 +6794 +3088 +4462 + +17031 +7995 +7350 + +5329 +2498 +2249 +2890 +1653 +2814 +3465 +2429 +5142 +1373 +1076 +3256 +3441 +2567 +3470 + +7072 +6394 +14586 +15340 +10147 + +1184 +3671 +6755 +4184 +1318 +5838 +1549 +2264 +2809 + +19812 +29553 + +5892 +1705 +3585 +1626 +6955 +5158 +1920 +3187 +2635 +4317 +1546 +2059 +3259 + +1837 +7240 +8226 +7841 +4213 +1359 +8366 +8041 +8457 +5615 + +3400 +4732 +9484 +2584 +3179 +7544 +7950 +7146 +2869 + +6427 +7052 +12827 +6005 +5345 + +11886 +4904 +15026 +8150 +2428 + +5226 +1184 +4964 +7415 +6726 +6062 +3801 +4207 +4667 +5422 +6152 +6809 + +11010 +3396 +3939 +10492 +10977 +1526 + +6235 +1219 +1240 +3401 +2883 +4055 +3590 +7311 +2287 +4448 +1450 +6571 + +4195 +7290 +6159 +2487 +1417 +3335 +3714 +2680 +7677 + +2389 +4734 +5970 +4799 +3294 +5785 +4205 +3461 +3951 +2188 +1083 +3154 +3160 +5131 + +3037 +7706 +2893 +5051 +2504 +5707 +3270 +1667 +7843 +8255 + +3971 +2506 +1225 +4862 +4154 +3311 +4597 +4483 +5029 +2931 +3724 +6267 + +5105 +2285 +3247 +1997 +7380 +2619 +5931 +5356 +7503 +1492 +6980 + +2372 +9012 +3114 +6193 +9829 +7515 + +2994 +2886 +7307 +6672 +9188 +6452 +7227 +1663 +2321 + +4061 +4316 +3828 +4449 +6179 +8549 +4645 +2389 + +5622 +4051 +3292 +5450 +4050 +5380 +3050 +1497 +5642 +2911 +4139 +6228 +4921 +4164 + +3019 +2696 +4175 +5228 +5084 +8066 +2002 +6316 +1896 +5800 +5010 + +3827 +4823 +1059 +6860 +4913 +2078 +6344 +4928 +4670 +3954 +5839 +6671 +1847 + +8618 +10069 +9967 +5072 +3126 +10051 +7873 + +2607 +11143 +1825 +6221 +8017 +9435 + +16412 +16329 +1854 +8746 + +1571 +2842 +5496 +5206 +2448 +3106 +1109 +3122 +4157 +5302 +5701 +5799 +3679 +2192 + +4301 +5488 +1830 +2337 + +7923 +3239 +9182 +1888 +6162 +1450 +6176 +3233 +2406 + +7771 +6540 +5808 +3970 +4350 +1340 +8384 +2276 +8802 +2848 + +5847 +3110 +3085 +5670 +5916 +2571 +2262 +2451 +1622 +4318 +4021 +4566 +5403 +4223 +5333 + +4537 +6349 +11104 +12051 +1978 +11190 +4207 + +5656 +5373 +3390 +3672 +6780 +5693 +2580 +1318 +6731 +6497 +6087 +4812 +1683 + +4013 +5016 +3679 +3489 +4541 +3353 +2013 +4128 +1089 +5016 +5174 +5962 +2476 +1202 +4038 + +7860 +3774 +3465 +2578 +2927 +5082 +6238 +4640 +4399 +4796 +5472 + +13289 +7271 +4915 +12428 +4991 +7437 + +1861 +6704 +9064 +9116 +9014 +3179 +3804 +3388 +9220 + +1542 +4467 +4690 +5711 +5771 +4787 +4920 +3270 +4137 +3723 +1897 +3557 +4111 +1133 + +31409 +26240 + +54757 + +11450 +16767 +23519 + +2962 +7702 +2733 +4930 +1625 +4819 +8294 +1175 +5457 +2818 + +6973 +17505 +9097 + +5350 +5398 +3740 +3089 +5707 +4075 +1216 +5204 +2666 +3231 +1938 +4479 +5828 +4838 + +7265 +2510 +11224 +4131 +13248 +1782 + +9488 +4374 +6103 +5519 +8562 +7159 +1375 +5488 + +1831 +4925 +4237 +7047 +4861 +1022 +1128 +1435 +4340 +3034 +6247 +1802 + +8584 +1369 +9026 +2651 +1936 +3739 +9534 +1333 +9577 + +3422 +5403 +2334 +3151 +5389 +6238 +6798 +3153 +2349 +2507 +7712 + +24170 +37492 + +10089 +4269 +8807 +4197 +6865 +2465 + +11707 +2757 +12186 +7550 +6848 + +2872 + +4350 +7436 +1658 +5948 +1318 +4182 +2357 +6368 +6596 +6849 +5834 +6740 + +4541 +3912 +8154 +8962 +6441 +8402 +5632 +4613 +3044 + +15710 +21759 +10989 + +2297 +5846 +5189 +4010 +1784 +5537 +1710 +4587 +4919 +2042 +3875 +1231 +1189 +5253 +4591 + +3073 +2725 +6203 +7249 +4089 +5208 +4083 +2246 +3511 +3208 +4807 +2344 + +2697 +1438 +3037 +4962 +3541 +3306 +4257 +2955 +1545 +3920 +6095 +3218 +4343 +5534 +1427 + +6900 +3342 +11170 +11907 +7355 +12479 + +1038 +8366 +9232 +8076 +8587 +3629 +4064 +9998 + +6287 +3967 +4660 +6274 +2192 +7327 +2320 +7645 +2270 +1937 +4081 + +24311 +11660 + +59340 + +6337 +5276 +1837 +3584 +1694 +5173 +3233 +6142 +6009 +5006 +6609 +3681 +4657 + +8509 +7711 +1338 +4405 +8726 +2762 +5390 +7733 +6562 +2982 + +4088 +12749 +16144 +2756 +2984 + +7631 +7535 +6105 +5294 +4164 +3887 +7604 +1942 +4003 + +7843 +5369 +6791 +7812 +8959 +1015 +7660 +8312 +9652 + +4738 +31158 + +15129 +5290 +10208 +14179 + +64834 + +17092 +20735 +17584 + +20179 + +6301 +9239 +5750 +8133 +4043 +1360 +7768 +4443 + +1874 +5287 +10423 +8366 +8343 +6700 +8319 +4207 + +9296 +1089 +5175 +2097 +14198 + +8741 +2040 +1298 +6200 +5218 +5703 +4398 +8164 +3133 +5517 + +8203 +11470 +9992 +5236 +3425 +13464 + +5741 +7636 +8651 +2228 +3812 + +7507 +4962 +8297 +7543 +7524 +4316 +7844 +4957 +3512 +8166 + +3786 +4240 +6919 +5851 +5750 +4494 +5669 +5055 +2882 +5237 +5003 +6899 +2143 + +5252 +7067 +5621 +1603 +7932 +2229 +8221 +2127 +2642 + +5887 +8125 +8737 +10040 +11446 +1559 + +2217 +4189 +8380 +8045 +8755 +13228 + +54109 + +1661 +6203 +5058 +4111 +3350 +2427 +2875 +1662 +1043 +2872 +3145 +2096 + +10789 +2296 +1519 +8104 +7658 +2462 +11042 + +4075 +25095 +12365 + +3620 +3451 +2143 +4928 +2209 +2259 +6291 +1922 +4258 +1298 +5973 +6830 +1690 + +6720 +6472 +7642 +3595 +1368 +2802 +3531 +5303 +1754 +5980 + +33359 + +11749 +3605 +11281 +1446 +6081 +2610 +9589 + +4086 +1683 +3542 +1782 +5999 +1239 +3191 +1829 +4645 +4154 +5315 +4039 +1170 +5072 +5837 + +5498 +2051 +1591 +3317 +2076 +4854 +5165 +6695 +8679 + +9267 +35217 + +5634 +6374 +5070 +2104 +5724 +5451 +6252 +2991 +6001 +6377 +1555 + +3235 +2411 +4950 +6073 +5384 +1309 +2112 +3943 +1158 +1942 +4894 +3041 +5480 +4287 + +8198 +16167 +2116 +4242 +3134 + +5254 +1059 +6196 +5498 +2120 +4585 +2757 +1442 +7062 +2529 +3641 +1540 + +2139 +17318 +19655 + +67758 + +13837 +3641 +8971 +8275 +7128 +1945 + +1852 +3110 +2650 +6258 +6653 +5424 +6283 +3827 +1203 +1847 +5970 +7045 + +3339 +4223 +3933 +5845 +4095 +1658 +4167 +2456 +2140 +3991 +1326 +4503 + +3459 +6780 + +6017 +17143 +2006 +15617 + +6357 +5973 +2832 +2404 +5466 +5263 +2442 +6483 +4672 +6030 +4179 +2206 +2294 +6168 + +2526 +7729 +5484 +5537 +8009 +3436 +5436 +7202 +7328 +2660 +2234 + +1256 +6714 +6588 +2886 +11142 +7214 +1867 + +2905 +3043 +5967 +2667 +1735 +6070 +3982 +6459 +1637 +1984 +1692 +2181 +1266 + +4355 +4571 +6495 +2767 +3262 +1740 +4560 +4120 +1892 +4609 +1276 +6129 +5883 +6009 + +5508 +1052 +1030 +6060 +3657 +3996 +5975 +1088 +2266 +4524 +7182 + +3034 +4023 +5263 +3276 +2948 +4466 +3517 +5358 +2969 +3410 +6135 +5900 +3376 +1312 + +8020 +7495 +2147 +1390 +4096 +2477 +7974 +4165 +1039 +1034 +7495 + +2474 +1473 +2810 +5689 +2742 +1972 +3315 +2083 +5077 +5477 +4451 +5582 +3126 +3173 +3823 + +11214 +7922 +4212 +5624 +8534 +7311 +11637 + +15693 +3473 +14621 +1422 +5178 + +7968 +3381 +3653 +4254 +5848 +6735 +2951 +3583 +3752 + +2701 +6136 +6047 +4179 +3184 +4990 +1776 +2015 +4756 +4400 +4733 +1665 +3399 + +3920 +1556 +3239 +5927 +1193 +4077 +4066 +4879 +5952 +2610 +3674 + +1682 +6139 +10994 +2262 +2315 +9710 +11296 + +12443 +4378 +6221 +8424 +7789 +1346 + +6840 +5808 +15893 +3310 +14216 + +5480 +1790 +2085 +3623 +3286 +4700 +3996 +2913 +2367 +1725 +5204 +2311 +2965 +3593 + +24055 +13551 + +11158 +6005 +13660 +11402 +10202 + +7769 +4788 +1884 +7859 +1587 +2695 +4885 +1651 +3921 +4647 +1109 + +5356 +8571 +5279 +2408 + +4523 +5592 +7243 +6911 +7604 +4000 +3415 +7335 +7325 +6703 +7012 + +5293 +6269 +5782 +6615 +4499 +7453 +6217 +5074 +7079 +7098 +6023 +6796 + +4735 +4908 +5414 +2580 +2794 +2243 +6211 +5507 +2794 +5024 +6115 +3177 +3466 +3455 + +4725 +1786 +2451 +4178 +3485 +1208 +2228 +4479 +2207 +4882 +4332 +3857 +3771 +5319 + +1401 +14031 +1695 + +1921 +9783 +5635 +1786 +10360 +6850 +4863 +1404 + +2442 +16957 +12686 + +4039 +5926 +5272 +5775 +6138 +7024 +6142 +6641 +4558 +5609 +7398 +2347 + +23477 +2485 +7786 + +5340 +1527 +1952 +2863 +2246 +5007 +6093 +3073 +3193 +4766 +5291 +2878 +2585 +6225 + +5259 +6647 +2722 +4293 +4990 +5668 +5620 +1183 +2420 +6872 + +1598 +6291 +8717 +1640 +8729 +6411 +1479 +7903 + +5887 +9297 +5108 +4814 +3171 +10077 +3700 +9785 + +5500 +6377 +2407 +8051 +4278 +2402 +2098 +5988 +2301 +4956 +2267 + +1802 +5166 +5094 +1190 +5493 +1562 +4255 +2126 +1959 +4176 +5354 +2921 +2743 +5640 +3116 + +11346 +12151 +12510 +11039 +11673 +7320 + +3029 +6031 +4235 +4697 +2645 +6612 +6585 +2072 +5350 +3869 +1793 +4184 +4684 + +6720 +6848 +1173 +5192 +2683 +4863 +6494 +2116 +2334 +2428 +3922 +5454 +4604 + +7695 +2885 +4466 +5049 +8098 +4177 +6464 +7981 +3183 +3346 + +5863 +3390 +10072 +4163 +9577 +6662 +5975 +8122 + +1443 +4466 +7142 +6107 +1032 +3545 +4362 +8074 +1339 +2477 +1322 + +1912 +14613 +15225 +16363 + +4119 +1645 +8059 +7384 +5633 +11876 +5144 + +2886 +7293 +17062 + +1344 +5571 +6367 +2730 +1134 +5853 +4098 +6827 +1283 +1437 +6932 +3271 + +3847 +1889 +6732 +1468 +1087 +3477 +5090 +3164 +5436 +6696 + +11985 +4877 +12181 +3096 +7222 + +12716 +11377 +11278 +1601 + +5418 +11900 +5334 +8971 +10651 +7907 +11469 + +6907 +7969 +2738 +3250 +4497 +5563 +2339 +7091 +2032 + +1092 +8088 +6222 +8095 +6713 +3648 +2551 +1956 +3413 +8164 + +6511 +6142 +4365 +4237 +6568 +1832 +5450 +3012 +3588 +2699 +4931 + +32059 +19019 + +2627 +8198 +10858 +11115 +1648 +2383 + +9821 +7551 +1459 +6217 +10094 +1445 +9978 \ No newline at end of file diff --git a/data/day10.txt b/archive/2022/data/day10.txt similarity index 100% rename from data/day10.txt rename to archive/2022/data/day10.txt diff --git a/data/day2.txt b/archive/2022/data/day2.txt similarity index 100% rename from data/day2.txt rename to archive/2022/data/day2.txt diff --git a/data/day3.txt b/archive/2022/data/day3.txt similarity index 100% rename from data/day3.txt rename to archive/2022/data/day3.txt diff --git a/data/day4.txt b/archive/2022/data/day4.txt similarity index 100% rename from data/day4.txt rename to archive/2022/data/day4.txt diff --git a/data/day5.txt b/archive/2022/data/day5.txt similarity index 100% rename from data/day5.txt rename to archive/2022/data/day5.txt diff --git a/data/day6.txt b/archive/2022/data/day6.txt similarity index 100% rename from data/day6.txt rename to archive/2022/data/day6.txt diff --git a/data/day7.txt b/archive/2022/data/day7.txt similarity index 100% rename from data/day7.txt rename to archive/2022/data/day7.txt diff --git a/data/day8.txt b/archive/2022/data/day8.txt similarity index 100% rename from data/day8.txt rename to archive/2022/data/day8.txt diff --git a/data/day9.txt b/archive/2022/data/day9.txt similarity index 100% rename from data/day9.txt rename to archive/2022/data/day9.txt diff --git a/archive/2022/poetry.lock b/archive/2022/poetry.lock new file mode 100644 index 0000000..74cb9e3 --- /dev/null +++ b/archive/2022/poetry.lock @@ -0,0 +1,533 @@ +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] + +[[package]] +name = "black" +version = "22.10.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "flake8" +version = "6.0.0" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.8.1" + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.10.0,<2.11.0" +pyflakes = ">=3.0.0,<3.1.0" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile-deprecated-finder = ["pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy" +version = "0.991" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +mypy-extensions = ">=0.4.3" +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "numpy" +version = "1.23.5" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pandas" +version = "1.5.2" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +numpy = [ + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "pathspec" +version = "0.10.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pipe" +version = "2.0" +description = "Module enablig a sh like infix syntax (using pipes)" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "platformdirs" +version = "2.5.4" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] +test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycodestyle" +version = "2.10.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyflakes" +version = "3.0.1" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pygments" +version = "2.13.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pytest" +version = "7.2.0" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2022.6" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "rich" +version = "12.6.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" +optional = false +python-versions = ">=3.6.3,<4.0.0" + +[package.dependencies] +commonmark = ">=0.9.0,<0.10.0" +pygments = ">=2.6.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "typing-extensions" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "dev" +optional = false +python-versions = ">=3.7" + +[metadata] +lock-version = "1.1" +python-versions = "^3.11" +content-hash = "00ff1a237fb70f1c8f8af043ce0c5ab3cd4c5e0ae7e10bdf95b72393c320f62e" + +[metadata.files] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +black = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] +flake8 = [ + {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, + {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +mccabe = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] +mypy = [ + {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, + {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, + {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, + {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, + {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, + {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, + {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, + {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, + {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, + {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, + {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, + {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, + {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, + {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, + {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, + {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, + {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, + {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, + {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, + {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, + {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, + {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, + {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, + {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, + {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, + {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, + {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, + {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, + {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, + {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +numpy = [ + {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, + {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, + {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, + {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, + {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, + {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, + {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, + {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, + {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, + {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, + {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pandas = [ + {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, + {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, + {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, + {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, + {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, + {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, + {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, + {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, + {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, + {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, + {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, + {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, + {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, + {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, + {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, + {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, + {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, + {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, + {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, + {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, + {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, + {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, + {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, + {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, + {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, + {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, + {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, +] +pathspec = [ + {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, + {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, +] +pipe = [ + {file = "pipe-2.0-py3-none-any.whl", hash = "sha256:12dc5baae854843d0fa8ab674ab555e58cc703eb64d8bf86da8db46b7115d07c"}, + {file = "pipe-2.0.tar.gz", hash = "sha256:a1cf3f29f98576b7e6552231142bc711e8dd324513a2c4525fc68c33f47fabad"}, +] +platformdirs = [ + {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, + {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +pycodestyle = [ + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, +] +pyflakes = [ + {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, + {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, +] +pygments = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pytest = [ + {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, + {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +pytz = [ + {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, + {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, +] +rich = [ + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +typing-extensions = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] diff --git a/archive/2022/pyproject.toml b/archive/2022/pyproject.toml new file mode 100644 index 0000000..8ecf128 --- /dev/null +++ b/archive/2022/pyproject.toml @@ -0,0 +1,28 @@ +[tool.poetry] +name = "aoc" +version = "0.1.0" +description = "" +authors = ["Colin Sullivan "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +pipe = "^2.0" +pandas = "^1.5.2" +numpy = "^1.23.5" +rich = "^12.6.0" + + +[tool.poetry.group.dev.dependencies] +isort = "^5.10.1" +pytest = "^7.2.0" +black = "^22.10.0" +flake8 = "^6.0.0" +mypy = "^0.991" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.pytest.ini_options] +addopts = "--ignore=archive" \ No newline at end of file diff --git a/src/advent_of_code/__init__.py b/archive/2022/src/advent_of_code/__init__.py similarity index 100% rename from src/advent_of_code/__init__.py rename to archive/2022/src/advent_of_code/__init__.py diff --git a/src/advent_of_code/day1/__init__.py b/archive/2022/src/advent_of_code/day1/__init__.py similarity index 100% rename from src/advent_of_code/day1/__init__.py rename to archive/2022/src/advent_of_code/day1/__init__.py diff --git a/src/advent_of_code/day1/part1.py b/archive/2022/src/advent_of_code/day1/part1.py similarity index 100% rename from src/advent_of_code/day1/part1.py rename to archive/2022/src/advent_of_code/day1/part1.py diff --git a/src/advent_of_code/day1/part2.py b/archive/2022/src/advent_of_code/day1/part2.py similarity index 100% rename from src/advent_of_code/day1/part2.py rename to archive/2022/src/advent_of_code/day1/part2.py diff --git a/src/advent_of_code/day10/__init__.py b/archive/2022/src/advent_of_code/day10/__init__.py similarity index 100% rename from src/advent_of_code/day10/__init__.py rename to archive/2022/src/advent_of_code/day10/__init__.py diff --git a/src/advent_of_code/day10/part1.py b/archive/2022/src/advent_of_code/day10/part1.py similarity index 100% rename from src/advent_of_code/day10/part1.py rename to archive/2022/src/advent_of_code/day10/part1.py diff --git a/src/advent_of_code/day10/part2.py b/archive/2022/src/advent_of_code/day10/part2.py similarity index 100% rename from src/advent_of_code/day10/part2.py rename to archive/2022/src/advent_of_code/day10/part2.py diff --git a/src/advent_of_code/day2/__init__.py b/archive/2022/src/advent_of_code/day2/__init__.py similarity index 100% rename from src/advent_of_code/day2/__init__.py rename to archive/2022/src/advent_of_code/day2/__init__.py diff --git a/src/advent_of_code/day2/part1.py b/archive/2022/src/advent_of_code/day2/part1.py similarity index 100% rename from src/advent_of_code/day2/part1.py rename to archive/2022/src/advent_of_code/day2/part1.py diff --git a/src/advent_of_code/day2/part2.py b/archive/2022/src/advent_of_code/day2/part2.py similarity index 100% rename from src/advent_of_code/day2/part2.py rename to archive/2022/src/advent_of_code/day2/part2.py diff --git a/src/advent_of_code/day3/__init__.py b/archive/2022/src/advent_of_code/day3/__init__.py similarity index 100% rename from src/advent_of_code/day3/__init__.py rename to archive/2022/src/advent_of_code/day3/__init__.py diff --git a/src/advent_of_code/day3/part1.py b/archive/2022/src/advent_of_code/day3/part1.py similarity index 100% rename from src/advent_of_code/day3/part1.py rename to archive/2022/src/advent_of_code/day3/part1.py diff --git a/src/advent_of_code/day3/part2.py b/archive/2022/src/advent_of_code/day3/part2.py similarity index 100% rename from src/advent_of_code/day3/part2.py rename to archive/2022/src/advent_of_code/day3/part2.py diff --git a/src/advent_of_code/day4/__init__.py b/archive/2022/src/advent_of_code/day4/__init__.py similarity index 100% rename from src/advent_of_code/day4/__init__.py rename to archive/2022/src/advent_of_code/day4/__init__.py diff --git a/src/advent_of_code/day4/part1.py b/archive/2022/src/advent_of_code/day4/part1.py similarity index 100% rename from src/advent_of_code/day4/part1.py rename to archive/2022/src/advent_of_code/day4/part1.py diff --git a/src/advent_of_code/day4/part2.py b/archive/2022/src/advent_of_code/day4/part2.py similarity index 100% rename from src/advent_of_code/day4/part2.py rename to archive/2022/src/advent_of_code/day4/part2.py diff --git a/src/advent_of_code/day5/__init__.py b/archive/2022/src/advent_of_code/day5/__init__.py similarity index 100% rename from src/advent_of_code/day5/__init__.py rename to archive/2022/src/advent_of_code/day5/__init__.py diff --git a/src/advent_of_code/day5/part1.py b/archive/2022/src/advent_of_code/day5/part1.py similarity index 100% rename from src/advent_of_code/day5/part1.py rename to archive/2022/src/advent_of_code/day5/part1.py diff --git a/src/advent_of_code/day5/part2.py b/archive/2022/src/advent_of_code/day5/part2.py similarity index 100% rename from src/advent_of_code/day5/part2.py rename to archive/2022/src/advent_of_code/day5/part2.py diff --git a/src/advent_of_code/day6/__init__.py b/archive/2022/src/advent_of_code/day6/__init__.py similarity index 100% rename from src/advent_of_code/day6/__init__.py rename to archive/2022/src/advent_of_code/day6/__init__.py diff --git a/src/advent_of_code/day6/part1.py b/archive/2022/src/advent_of_code/day6/part1.py similarity index 100% rename from src/advent_of_code/day6/part1.py rename to archive/2022/src/advent_of_code/day6/part1.py diff --git a/src/advent_of_code/day6/part2.py b/archive/2022/src/advent_of_code/day6/part2.py similarity index 100% rename from src/advent_of_code/day6/part2.py rename to archive/2022/src/advent_of_code/day6/part2.py diff --git a/src/advent_of_code/day7/__init__.py b/archive/2022/src/advent_of_code/day7/__init__.py similarity index 100% rename from src/advent_of_code/day7/__init__.py rename to archive/2022/src/advent_of_code/day7/__init__.py diff --git a/src/advent_of_code/day7/part1.py b/archive/2022/src/advent_of_code/day7/part1.py similarity index 100% rename from src/advent_of_code/day7/part1.py rename to archive/2022/src/advent_of_code/day7/part1.py diff --git a/src/advent_of_code/day7/part2.py b/archive/2022/src/advent_of_code/day7/part2.py similarity index 100% rename from src/advent_of_code/day7/part2.py rename to archive/2022/src/advent_of_code/day7/part2.py diff --git a/src/advent_of_code/day8/__init__.py b/archive/2022/src/advent_of_code/day8/__init__.py similarity index 100% rename from src/advent_of_code/day8/__init__.py rename to archive/2022/src/advent_of_code/day8/__init__.py diff --git a/src/advent_of_code/day8/part1.py b/archive/2022/src/advent_of_code/day8/part1.py similarity index 100% rename from src/advent_of_code/day8/part1.py rename to archive/2022/src/advent_of_code/day8/part1.py diff --git a/src/advent_of_code/day8/part2.py b/archive/2022/src/advent_of_code/day8/part2.py similarity index 100% rename from src/advent_of_code/day8/part2.py rename to archive/2022/src/advent_of_code/day8/part2.py diff --git a/src/advent_of_code/day9/__init__.py b/archive/2022/src/advent_of_code/day9/__init__.py similarity index 100% rename from src/advent_of_code/day9/__init__.py rename to archive/2022/src/advent_of_code/day9/__init__.py diff --git a/src/advent_of_code/day9/part1.py b/archive/2022/src/advent_of_code/day9/part1.py similarity index 100% rename from src/advent_of_code/day9/part1.py rename to archive/2022/src/advent_of_code/day9/part1.py diff --git a/src/advent_of_code/day9/part2.py b/archive/2022/src/advent_of_code/day9/part2.py similarity index 100% rename from src/advent_of_code/day9/part2.py rename to archive/2022/src/advent_of_code/day9/part2.py diff --git a/tests/conftest.py b/archive/2022/tests/conftest.py similarity index 100% rename from tests/conftest.py rename to archive/2022/tests/conftest.py diff --git a/archive/2022/tests/test_day1.py b/archive/2022/tests/test_day1.py new file mode 100644 index 0000000..fff3144 --- /dev/null +++ b/archive/2022/tests/test_day1.py @@ -0,0 +1,27 @@ +from advent_of_code.day1.part1 import calculate_max_calories +from advent_of_code.day1.part2 import calculate_top_3_total_calories + +toy_data = """1000 +2000 +3000 + +4000 + +5000 +6000 + +7000 +8000 +9000 + +10000""" + + +def test_part1() -> None: + result = calculate_max_calories(toy_data) + assert result == 24000 + + +def test_part2() -> None: + result = calculate_top_3_total_calories(toy_data) + assert result == 45000 diff --git a/tests/test_day10.py b/archive/2022/tests/test_day10.py similarity index 100% rename from tests/test_day10.py rename to archive/2022/tests/test_day10.py diff --git a/tests/test_day2.py b/archive/2022/tests/test_day2.py similarity index 100% rename from tests/test_day2.py rename to archive/2022/tests/test_day2.py diff --git a/tests/test_day3.py b/archive/2022/tests/test_day3.py similarity index 100% rename from tests/test_day3.py rename to archive/2022/tests/test_day3.py diff --git a/tests/test_day4.py b/archive/2022/tests/test_day4.py similarity index 100% rename from tests/test_day4.py rename to archive/2022/tests/test_day4.py diff --git a/tests/test_day5.py b/archive/2022/tests/test_day5.py similarity index 100% rename from tests/test_day5.py rename to archive/2022/tests/test_day5.py diff --git a/tests/test_day6.py b/archive/2022/tests/test_day6.py similarity index 100% rename from tests/test_day6.py rename to archive/2022/tests/test_day6.py diff --git a/tests/test_day7.py b/archive/2022/tests/test_day7.py similarity index 100% rename from tests/test_day7.py rename to archive/2022/tests/test_day7.py diff --git a/tests/test_day8.py b/archive/2022/tests/test_day8.py similarity index 100% rename from tests/test_day8.py rename to archive/2022/tests/test_day8.py diff --git a/tests/test_day9.py b/archive/2022/tests/test_day9.py similarity index 100% rename from tests/test_day9.py rename to archive/2022/tests/test_day9.py diff --git a/data/day1.txt b/data/day1.txt index c6e33b0..541babf 100644 --- a/data/day1.txt +++ b/data/day1.txt @@ -1,2242 +1,1000 @@ -2936 -2154 -1578 -4820 -5674 -5582 -2392 -6148 -1276 -1783 -2572 -5067 -3526 - -1673 -10546 - -1036 -2765 -2244 -1018 -2363 -6858 -4640 -2614 -2660 -4411 -1118 -6887 - -3965 -3978 -3991 -8557 -3150 -3801 -5310 -1991 -8961 - -8526 -2340 -4983 -3750 -3471 -1564 -4638 -7198 -3127 -5522 - -5417 -3737 -7464 -2219 -5174 -2873 -1650 -3044 -6290 -2640 -5499 - -1946 -3463 -7792 -6268 -2608 -5922 -3812 -2292 -5730 -5798 -2785 - -15448 -14133 -15280 - -32925 -9977 - -31033 -36925 - -7793 -4374 -3042 -3900 -7160 -7472 -6251 -1866 -7489 - -6884 -7643 -3926 -3857 -3326 -7619 -2831 -8489 -8212 - -8447 -1468 -1100 -6492 -9151 -2144 -6579 -1951 -9223 - -28622 - -4166 -2686 -7394 -2773 -5777 -5734 -1164 -1916 -4040 -7119 -1986 -5178 - -3920 -11406 -1982 -1596 -2852 -9750 -5758 - -4860 -10579 -5897 -9117 -2767 -10259 -8488 -1120 - -11037 -16409 - -3114 -5793 -9778 -5873 -4201 -11491 -3555 - -1793 -9922 -21194 - -3578 -4113 -4094 -7777 -4623 -4349 -5554 -8046 -6099 -2934 - -18520 -22405 -22499 - -3978 -20163 -16656 - -4073 -4198 -2156 -5691 -4071 -7596 -5628 -7557 -6776 -3796 - -10611 -1321 -2692 -8966 -1069 -3168 -11061 - -2025 -6601 -2981 -3962 -5499 -3940 -1548 -2094 -5794 -6120 -6393 -5493 -3611 - -2539 -2894 -7029 -7277 -1467 -3123 -6152 -1023 -6351 -6054 -5440 - -2877 -5142 -4862 -4155 -3692 -7854 -6712 -1462 -7198 -1111 -1548 - -3246 -19782 - -13975 -11522 -12604 -1220 -4652 - -1860 -2373 -3595 -6084 -5099 -3484 -5828 -2102 -5249 -3382 -3129 -3963 -2298 - -7770 -4139 -1491 -3495 -5239 -9025 -1745 -2254 -9599 - -20903 - -1009 -3131 -3866 -9099 -9002 -2730 -7083 -4350 -1239 - -61041 - -59008 - -6746 -5100 -2503 -1809 -5988 -6011 -1652 -1291 -4348 -6322 -1982 -4321 - -4090 -7038 -6586 -4222 -8733 -5201 -5132 -5260 -2548 - -5959 -6803 -1420 -4281 -1380 -1566 -6317 -3029 -4666 -4459 -4039 -4104 - -14286 -13187 -11293 -6804 -9011 - -4002 -13481 -6528 -14618 - -5247 -9496 -2951 -8130 -4237 -7737 - -9223 -12089 -12087 -7816 -9441 -10626 - -5465 -3972 -8692 -13696 -11295 - -9724 -17909 -23253 - -3418 -3116 -5056 -1656 -5994 -3336 -4612 -3063 -6783 -2118 -4666 -1343 -5492 - -3910 -4692 -1113 -1799 -5139 -3531 -4893 -2612 -5573 -3298 -1612 -4609 -3372 - -1787 -1838 -2569 -2437 -3770 -2197 -3144 -5940 -6248 -4953 -4674 -3697 -4926 -2660 - -6814 -2923 -1517 -2468 -6726 -2925 -4728 -4433 -6343 -4225 -4081 -4445 -3555 - -6727 -5809 -10250 -7025 -9307 -1102 -7950 - -5769 -5786 -3105 -1538 -1836 -2025 -5583 -1900 -2558 -2418 -3541 -2765 -2474 -4071 - -3368 -6393 -4684 -4010 -7804 -8291 -8889 -2384 -6981 - -2112 -4039 -6338 -2628 -5228 -3427 -1788 -5138 -1891 -4216 -5905 -5629 -4588 - -42033 - -57235 - -3821 -5741 -4265 -2601 -5218 -3592 -1816 -1199 -3577 -4657 -1068 -5495 -1614 -3586 -1894 - -3638 -3088 -6292 -2293 -5310 -5129 -4082 -3982 -2596 -2252 -4279 -5800 -4607 - -5351 -13793 -10195 -5951 -9105 -9951 - -4126 -3798 -1905 -5413 -1956 -2246 -3559 -3993 -2447 -2600 -1478 -5856 -5595 -1416 -3749 - -5758 -2495 -1185 -5261 -4898 -6858 -3304 -5540 -6718 -6596 -4806 -3161 -2222 - -5011 -7613 -8709 -7915 -6889 -12127 -8855 - -3479 -5863 -9234 -9019 -13582 -2978 - -10216 -13081 -5805 -3791 - -6591 -1319 -1901 -6087 -6769 -5230 -3857 -1690 -1471 -6775 -4204 -2166 -1192 - -6571 -9490 -3259 -2326 -5084 -8723 -10744 -8363 - -5693 -5198 -3911 -2606 -3996 -1377 -1248 -5244 -3169 -6347 -4885 -4255 -6175 - -7476 -1656 -24309 - -3801 -5855 -2015 -2516 -1313 -3658 -5344 -2769 -3269 -3797 -6851 -7192 - -1254 -1999 -3039 -5211 -2624 -6505 -3214 -6949 -7036 -7926 -2469 - -17404 -21131 -13342 - -3789 -5360 -2709 -4535 -5734 -5686 -3180 -1711 -1719 -3476 -1747 -3526 -3642 -3528 -2035 - -5978 -6149 -7455 -2176 -6878 -2191 -1291 - -2498 -7020 -7297 -4930 -1920 -6770 -4661 -4429 -1639 -5593 -4552 -6441 - -1804 -8012 -2515 -4692 -3062 -2261 -6532 -6486 -3061 -4968 -1284 - -3640 -9961 -4058 -3247 -12036 -5775 - -5253 -5478 +fouronevhnrz44 +eightg1 +4ninejfpd1jmmnnzjdtk5sjfttvgtdqspvmnhfbm +78seven8 +6pcrrqgbzcspbd +7sevenseven +1threeeight66 +one1sevensskhdreight +rninethree6 +eight45fourfgfive1 +xdlnbfzxgfmhd4t +7tf +8oneldkrfcssbfeight +five5ninebvvfv +sixrhxkzcgfhltrchq3three91 +lnxms8 +threekv33eightninethree +fourxrsxhclj99twosevennine7htxdr +5hdhtdxgktztjdjrhkmlblsevenseven1four8 +25xmvshkbmtkmvqpfhgq8fivefqctjm6two +nine533two +sixmbkjzpcxvfive2 +seven3fivevhkpjvfqsfivemfdvlkhhmmvtztjf +3eight5threefour +fplrjjznseventwocrv9 +mxqvdb5onesix84fpkzf +17five6mvxgkkmz2two2mf +lrqnqfncvvvrrpkfour92xsxfztwonehsb +dphngmgfhhhcjxmbmqdk3nine54 +34xdbhnbhbmljxc55oneeight +cpgdcctwothreevlqmk1qpdthree +977ckpkmx5 +7cx81 +vrtgzhhrsevennzgjqhsqdxcjtm2gsj +dtkgj89bz5threenine +256mctgqnjbpr +smmthmrnj6threevrndhnrqq4qpnxz +vfrcvbgpdfjbzhchqmtjgxrmddhmggmqrgs7gxfjffivefour +twoeight8two3 +threedpfour5eightthreebc3 +csdfivefhgkjfcsvsvqsrbtplhjnine7pqhpvhjqone +seven3375sevenqgjndftrsh9 +4six1npbnvfdl27hqvdrxztq +twopmmblrnhmq6zp1 +34jvrtkfdcmnmblg269six5 +fouroneeight1lpvssjskkjvhpmcb +kjb6 +8rsix4 +hcprhbhzgjklpql92pntdmxskg +3766zthm7lts +eight9sixqnkqbfrbrstbxxsixeight +sjncbhbcrmnmsmf4sixkhscclmrjfjgqgrdtpjqpgdsg3 +zrxtgzscx5lgfcsbqkjnst1 +nineonedzhsqlscgl2xpk +9eightljkpkkq +blhstnzdfttwocfjhgsix41hrx6 +5dzsix5 +vhlkone6five79 +nkkm65tfnxhtmzrfpfive +7hcnzjn4 +ngckn5ppcsvjsbstwo +5qld +zbgghnineninezkphpf6 +8nine4sevenjlhlzlbztxbcrpc +3bcdmqxgb +8xvhfr3foureightwocj +nine68zvlfs +8one8xldlrninenine81seven +7dtvdvgnnqt6 +htxkfzhxhfmc7631lklzppbtrbfive +seven89lrxddqtsvvt18 +dnvcsqcmp7fourkrjhndsghjr +ztkqqqdctdeightonefivezdctxbfg7two8 +lptlbtmmkdthreetfcttkknf53gtmvkcgmj9zvsvmsbstznmd +hbxr1ninefvjkkxkhbrtwo6 +dbmxvpsvp7jdnvsdnlv +seventhree1 +seven1oneseven +seventhreejcdvcgfthzlvl8eighttwo1 +2fqkkgsvpjv9ninesix +xfmkdtxk2two +6fourfive +hpghf2cfgrmb34 +714 +nineonemrzxsmtwo28 +llgnrpcdxt4eightninedl9 +pdvhcvpmceightpfjpgvbfnrhh9 +gvzzrvhmj464 +592eightmvkdnjqthreedtcldng9 +77nineonethreerqnrgczsn4hhdnpbtkxthree +four78zrqfourtwo +5chnktntwoninezqzfhthreegpmkvrsbfs +mpgvbnzldvbhchthreeseven4cvone +nmfbdpeightfour9fiveqnnmbfsheightsix +onexrjdhtmsdkssrgghlfsx5fourtwofive +5seven3zfdnqxqqdgqcphhjctjhddfggrfstqrb7 +hcpcvfllseven8 +qhpmcthree1sixdjkg +32mgqbmsn6five4c1 +seven78 +four8three +9seven5five6 +five67 +twopqsjvpfxdone81gsztrlxrhx5 +9bctqg +jqkhxlnvfhninepzmvfmm5 +fglgdrnlnqthreeeightfoursevenseven368 +nineeightjvzdqnpnzf86qpffrfsp6 +34kckxkrq +sixppr854 +oneeight6 +7onerhqgbzheightpvxjnsfdnmfive +68seven3 +56ninedgzqmlvjp22 +six69nine7threethree +6oneightskl +5six9four5twoone +fivefourfourhvgfqrqst99 +2qvvnrbvjhs8dstfpfnineldkpnkskz7 +41jrhj9nfeightonecqrdg +7onefour8 +rxtdz5gbxbvdxbbpghfvljdbknqsqgtmmgrhf +79kftqmdnbj +1cf4 +threekdrpvtsdtrdfzxtvqh3 +zxcnsfkvfivezhcknlhcqfour9159 +twodjdbsfive7two +47bnvbkseven4one7 +nleightwo7 +twofive5gptl3nine6twopngsq +eightqn32seveneightqfrfmsfgqhfourvrgdkfnxn +sixfivefivepnxb1jqzx4lk5 +three97onebssix2 +fivebvkhcmt3one6twonegf +xzrv997pfhxsblfive8 +5nptkzbsixxgpmrkxponegnnqfqtgvl4 +7mvxkfkjkxninesevenxjtrjxbj +jfloneightfivetwo7flmf +qpncksix1fourthreesixtwo7fcjjdx +17nineninesixhpbh +four88ngtbtfcqfr6tjqbqhrktf +vgtvfsftvljjkxnsevenltszqrgm6cgxjlqsgcqonelcdjv +6tznfmdzxkt +nineoneninefive2oneightdp +kmjjzvblthreethreefour1dhrsk2pfjx +fourfive6six2 +rmqzgfivenineeightnine6qqnxclq +fourninefive3kgeightonerfxsr +four7qjpkrfxsvt31seventhree +vqgqgk69twoseven +qfxvmhk9 +six1b69 +vcbmbfjrdpnfour9 +twoclpjtndvxj8fpxblseven +28xrggnqqttk544 +39hgczgvjhvs31fivesix +qstz85sevennine +ddc5lqftnmhldv4dxfvhrxcnltr61 +ninedhhmpzntqlninef7 +63fourhznh +three39foureight +4zlfzjfrqsixjzb +2sfiveeight +fourfivefive46 +fglfbbseven7445three5mfgrmkfgdc +8sg +128three3seven +five4threehrggrjgjpninetwo5eight +3hjnmvhtfxpzmdt7224txvnpnjsjf6 +beightwobhz86fdhsthreeqjxccxhjvk45r +lgd2sixf7 +6ninefour +hmhfeightsevenvlgdrm3five6kkjblfqbjsnxtcxrpg +jxvh5jjxvfdeightwon +1qfqdqxvtsztkkjxqz +1onenineppgphdtt +fourrppqprfmlpxbvdhpltfive1qfzr +xhqkzhchcmfnrpstgntwobrntnm4 +nplmsixmx5six +dtvrlxzdb4clddlfivefour4one +67cnqshcbgsix54two8 +7s +fourfourhbv28six91 +seven6twospmcsixcvmzfj9nine1 +1five1bphjprtm2twoxfslkqh9four +eight7bfzdbfccfl7 +8eightl +klfpjslgdmgbxlftszdltn1 +eightseven5threeseven +onenjvvqsfhgfhmtv6foureight51 +qttmv8zxdh25hshpn4 +7875 +3ljptgbzsix1sgqrqlgml6sevenfktjtgtv +tdtwonethreeeightfivethreeqmdmc9 +rkx1 +eightseven26ftngc +tjxxsdsnxg696xhthree +2gdbxmxqjxnninefivenzhpmx3zqh +91kq5sixspxqqvpjxrp +mkztv5knjkzrgcz +3ninefpdbptdnine3qpzc +fourtwodg86 +nineeight1sixfourseven +dvlgone1foursndcghxgxzrtsztceight8 +6bskrcjthree +fourninebgcqkdlrx79 +4sevenxfoneh +gmvptkcgx69vqxmckppmlnptsrndfrhtc +9959ngrjdgltllpmrtbrgrdpnjlgl6three +2c +3qncfdmhdcmleight1 +3eightvfstts +sd7175nlpq9xhfour +foursevenfour477four +snsixthree7bmlrvdtmx +nhsninesevenjjhgthzhfour66seven +52onepcltqtlnk +fivedvndklt1twoxplzqtgf +1twohpd8xxtwojmcblxxtdk +nnctpnrhjtqvcpnbncpfsixseven9rrbxblhcsr +95ninemvhbqhpkqksixsevenone +5seventwothree +threeonetwonine2 +cqbrtdnjzgx38twoneshm +4fivenine1 +czsfivenkkqbqbbpc1 +sjmeighttwo32one771 +5mtmkhkhd7nineeightrq4six +one7vknzhj9ninesix +jcsqnxhp1pmfpvkdmcgzm +zjm5two2 +4onejhdtnhqtlcggbxpmhtfiveone +nr6hvcspxjgvmlbdtgs326two +fivevsrfcv5fnkpftvrbnine +kbtwonesixbbrtjvcbblzh4 +2fourthree +eightntgeightfivesix8 +twoninefive42 +bcjxfqlqvfslqgq52 +tmrthree8twoxthreers +9fivenineeight9xdnnqkfbnkg +onesclfxsljp2 +5one34 +18nlbghthpmhntqpxnfivebfstnkcrpvxmrlrhcq +fourthreesix43three2fhn +nine5zbqpcxffpmmzxp +dbjgphmmvf7eight +6tks +ldnkcj6572two5sevenf +6jlbdqjrx86pxxnhneight +191pbjnlqh7vkgvrhtrkxqfgxczq +qpxpcnmmmone3zkm2nine5gttbdpggf +vnbfthmm1hckvdcqqv1sixxpldbmnxmmgrbl +eight5ftlsixlmrf +6gtqkvvmvvq5seven6mkxvxpfthreenine +jbskqm5gfntjjqtz +2eight72 +nineplkthreesxpeightxzkfvg4 +xzcqqnq5seven2vtsldzpfnine +six9t1rmbnzrkdh1 +75kcdztv7 +two4gbffour +seven8rlqhshzsixmtmpvfzjpeight5sixvh +7nrrcqpdqhfourthree +21fivenine2kjxmlmnhz6 +3stsfthreejgzxhbseven7threebfhlml +dtdeightwo4jxrfivebpzf +qhrr2five5oneightr +pp2pbjgmgffctbtseven +737kbsxrtpcgslrmcnd4 +qpxrkdnineqzkkhzjfqqv7twocghmkrh47 +gfptsfour4ldrjlvzghq +9ninezvxqzhlgzckb8fztrsevenvlqgdm +7562sjpbvpeighttwo +qsmnktmlpznxz25gpgjqsm +7two5tctnfxgqvd2four +rls41threezlpkvtbhvk4sixnine +six8dpd +msljvkd6fourbtzfjphskfxqpjkzmzgkxvqn6hddzxj +mfspzjjcfour49csfjgjkdmktns +b3tllpmmqkktclkntlbgkkg9five +rqnbftghx35 +rcgrb26five +sevenvkhzbljfour9czkpdltxlbqbdgcpz +two7fivehrqeight +mgmvtjl1zffzbt3two +trxmmtdrvh1scjhcsevenonejmzhsbttgfseven +one8sixtwo58 +nrs24 +threerrrrtjhngptrpsrq8sevensixtwoonecntmmmxtjf +mzgmrh5qcml +4lfxxdgnnjzeightninesone +phvmnnvzseveneighttwosixplbrb5 +sixnineqqgbmlxdrvsrfhkrff5 +6sdfldthgvctwosevenvvnbgqxjrn +7112xslv +sevenfoureightfivefivelkhnxb98 +nine6pljkszdp6 +two4xlhfhrz5kbpstsfive +bbgdsix5 +sevenlcbsdlhftwozsnx1two5 +one2jjmlqsnxx1b +sevensixsix5sevenzqhjzlkjgnvsxfkfvxzhq +lone19four1 +1fivesixpv +eightfour1 +xsbgprjfthreefoursevenrqzbcbfnbhtwo2two +ldtwoseven47dcrppbfbv +1fivexgtwosixone18three +nine93oneseven +5qdneight61xpg +rdzckkb5five7ggmbkzjshx +37lxlgmveight8 +scqvdhm9b +seven9six +pvthreesixfourgctbsix8eightseven +83oneonej +5four83cfmnthreeone +fivefiveeight1 +9tnbqpthbn5kvgmsmfmfsevenqdrksixmbmgm +onecrs76 +vgdqvmt23onesix +dlvmvtj6eight2dxjrhdlfghfhxcsxz6tbkz +414sixdbzhmxthree +sevenfivesevencffvbdhtk5qmplrjzxnjnbnt6 +qgqjxchmxfourknine447three +4tfour +fivercfvsvlfglbxrtvxznhr8five +sevensixonesix7399 +two17 +zcmdlqzhps5twotwojkltrxb7three +xllqtjpxsixsevenfivefour29 +ninetpzpr51 +6751three6 +rcfpnskfivethreelbtgpltxsevenfourbtcs8eightwokb +eight7rfr2 +six5onenine29 +zjbj238 +rgprs5fiveldvmgqktnn +meightwossfvkncf5sevenfivesqpgrtnnj +onez4eightfour62tmrjmprthree +foursevenjtwoc3threesixfj +qmmzmzlxmthreezvzxv6zgcztv +73mbm +nine251k1 +sixhtfhzcbtq7sevenonesnkpfvsnnnine +seven44vp4jxbrvkzcmlnjfiveoneightvzx +3twoseven5 +one8mfpgflgqkb2six7dtgftrplb +lrgnb4ninetwo5vjsmmb9 +6sixq2three +999eightvkpcpv4 +947fourtxdmhv +9msczjqjggsk3six4 +bone1 +5fivevvlljvmsdgqjnrhfourkstccckr +7hpblpnmxqlninethreesixpvpnine +nineeightdsrqfdnghgkeightone8mpkvfdhz +4sevencrjtpdq +mbvgsfoneltqkfnbpftxhtv7two +onegbvcctwo8onesevenone2six +vt36onetlmtqbv +nvvxx51 +threefnvcvbnzvs4 +7rxcjjdeight81587 +mdmjsg3seventhreesn +dtxsdmsvjcjx819jhhpzzf9 +9jcxsninetsl2 +6vcllfssthkxgdgh1ghjscsrvnhrpmjllh +6kkhpcjhmseighteightppvdkffdcpchttzone +878 +sixdkkjchkjqtllfpn31rpgxspktkgxjgcf +2eightsixzs3kx9 +sixthreetwo9 +35vtgrpcqcnvfive +4ninegqqlc49fourthree4two +czd4eight +tfcmfdxhhqlroneninethree43 +8tbx +1xqpdxznzhsixseveneight2 +6hg9clj +vfnthreevzt88 +seven4317pkxd13 +stvltfvs7eightcmj +nbrxfmsshronesevenrrnp8seven4 +7jvtgqvm36fivegccbpkp +6threeeightfive8tnlninekb +eight1sixtp +17ninezjhchkvq +tfxvhhkltlnffournlmlsqfclqlrsk31 +two889threezthree1two +five9one48twothree +eightseven8dqjsixlrsrscgzjpfour4 +988nine4fk3 +76dfkqfbqzffplx +9zmgrr9 +jhsbj4twohxrgdr +kgcfgninetwoctqzfbhhvffive2fzlk +8six25 +six35oneseven7 +2cvxrnine33four27zk +4xctr9threemrckmkmjgtpxzfqdzg +fivelrs3ncmgdxgqhnfqrlzlnbvrqp +3zgblb +rztshfoursixfour226four +2hfth +5d94fiveninezfvprvgtnxfive +21four5zcb6szsjgsseight +2fivefpdkzxxgchfourp25lsnqjrmxmq +gxlbzlfzsixtwo8snhpdtgdgthkrvzsxkd3 +five4n2 +gscjzkgkeightqlljzx12fiveonebqzmlh +xhsrzj1 +klxkdzxvvrljbnrhfive7four7 +3sxmbgvxkmkpfqxccvj8eight2hl +2bcdbsllgcmftxftmzrhnfive9dgkqpqkloneskztwonesgh +eightsix7nine7eight69 +five6lsgslhtzzv +fivesix47 +3kxfbcjz6vmhzvkgpjbfqq34seven +threevlmlfm58threebkfdzd5fourkpgddjlqsz +sevenzdeightdtxrxzckfktrfpm7 +qjkrfltlsdrrcm6 +795six3hmlkdnine3 +foursixxjnqsljktnnbtwoeight2mskdbkbtk4 +fivetwothreeeight9sixqhqzm +fiveqjdksix14jlzcvck +16sevensixvzjnh +nkpshpkptggnsxp272three +zrv86 +35lgqsdfive6 +x3npthreethreercmnlphkchmrmcg9seven +5sixninefiveninenkxrvmk +jfjqrvc3 +bbqxjhds4 +hdkqkq5twodbbrpnbmmj +4twosixcfdcf515two7 +mgzljdxqkpzbhfh62threenine74mcvrf +4ninesevenvnblskhgxmhvkhpmxg +fourvktpjlpr5sevencfvthree +9six9vtrkdfjkbb4five7slq1 +dhroneight9xthreenjqk +eighttwo1twopxzxghjs9 +six35ctcjrmfclone +d1sixmmctvr8 +qsgcbzdtworzgzbqtrd7pttltxjsgptwomfmrzns +sevenseven6twocqhvmvgxn9vmlxpfourjvqsnmlbd +7twopc2four +three1nineeightgrnzbpqsvbkpbqzvmqsnm +91fdf985tdjvtwo9 +svlfivetwomjhzfourone7 +bqpssscxckkljxxtwo8dpcbpqgq +gjhdqvgcfive3five +bpqdnpbf97tgpkkmdg +1lksrsrlqkmzmbfgpcqq +kfftvhrlqpstwoone6fiverklbhqqgdpvmnine +xbtfhfivenine9lpklrnrrbnthreensvgrvdzpfpvzznq1 +xkfjtzdqmhnine96sdgfveightttbhfkthree +fourbz2six5 +rggoneighttwo19vfdjvjbr86zkqmfclp +3fourx4klhkhglvjszj8 +glg2fournine5sixxbjseven +3zdpsone +htxgljmx262five5 +3ftshpgpnnhgspltjrvb3cgnghgzpvzlnxvzcjone +threebbnrxczqninetrone7eightseven8 +g2seven +threeddtgc8 +3fivepcfgpvjzsj471 +28zfour7seven +clxslzrrkbbmxbkzfnreightone6twodlztb8g +9eight1 +2gvvdgnvnptwohhztfggrndzhplqgx +qspcbvlv48 +1eight1sevenrlhdnhs +fivetpnnlnp317seven +n4onetwoninexnvstftnchzfxzrqts +2lthreeseven +two3twoseveneightffournbrhmseven +seven6fsxnfqmlg75bznfkjbch81eight +4dgszfourggjmjjjrr5xmddgsgp +b5283sbqdn36qcrxnphkg +9lmklvnvczeight +cgm2vsrmjtzmbh +7lhqhfm5sevenlg +69cmcnbqseven6bnztjrpfvx +eight84nine8 +92xcmffvvbr +fivefivetwotwoglzqftlfpnine2 +gtffdsrzmmnine6fourtwo +cjnxbkvxq7onexjjhds +onenine9lgkp4bxztcseven +bthree4 +bqq4dbjbkftfx2cxdrdgjsixxqlcgztnv +twovtxqhsgx72jtgfqzfqnine4 +87gjbghccqrsqxbflkhk2fivelmkmjzmfzxbcmjtb +seven7six83vdxxrfbfkfg +sevendnjssc7threecrccqlsf5xtgmqk +sjphck271threekvldbgnvtcxlcdkf +sevennpfbbsb3kgpdm +ngmhtfnkjl5fourfivegnpb +xthdbtwofcgdrrjmfive1five +89hgld6sevensevenfour6 +36kgtmxxx1fivenineseven +eightdklr6 +23zkrplrpmlpclqjkrsrxcbjone9ffjrqvsix +5njvthreeftxjninefnlcq +1qb +three5258kpcrl +szggtxbvql443 +3threemvbzslgqdninesevenxzgbfkcg64 +6fivefmhtdcbpx +five4fivesix +9ninebrdczqjpnine +q33ninesix6threepbqjnjdb +onelvhdtljltmjgdsnine1eight7 +one2seventwo +4jnfchm5jtqgbmnctrsix +5six3 +eight9hklfhjnine2onerl6 +2nzncz9fourdcqmmcfgbgsqchvnrdnrcthree 2337 -5508 -4905 -5950 -5556 -1425 -5441 -2823 -5915 -2901 - -5247 -4417 -1117 -3120 -5747 -1237 -4181 -5554 -3357 -1711 -6794 -3088 -4462 - -17031 -7995 -7350 - -5329 -2498 -2249 -2890 -1653 -2814 -3465 -2429 -5142 -1373 -1076 -3256 -3441 -2567 -3470 - -7072 -6394 -14586 -15340 -10147 - -1184 -3671 -6755 -4184 -1318 -5838 -1549 -2264 -2809 - -19812 -29553 - -5892 -1705 -3585 -1626 -6955 -5158 -1920 -3187 -2635 -4317 -1546 -2059 -3259 - -1837 -7240 -8226 -7841 -4213 -1359 -8366 -8041 -8457 -5615 - -3400 -4732 -9484 -2584 -3179 -7544 -7950 -7146 -2869 - -6427 -7052 -12827 -6005 -5345 - -11886 -4904 -15026 -8150 -2428 - -5226 -1184 -4964 -7415 -6726 -6062 -3801 -4207 -4667 -5422 -6152 -6809 - -11010 -3396 -3939 -10492 -10977 -1526 - -6235 -1219 -1240 -3401 -2883 -4055 -3590 -7311 -2287 -4448 -1450 -6571 - -4195 -7290 -6159 -2487 -1417 -3335 -3714 -2680 -7677 - -2389 -4734 -5970 -4799 -3294 -5785 -4205 -3461 -3951 -2188 -1083 -3154 -3160 -5131 - -3037 -7706 -2893 -5051 -2504 -5707 -3270 -1667 -7843 -8255 - -3971 -2506 -1225 -4862 -4154 -3311 -4597 -4483 -5029 -2931 -3724 -6267 - -5105 -2285 -3247 -1997 -7380 -2619 -5931 -5356 -7503 -1492 -6980 - -2372 -9012 -3114 -6193 -9829 -7515 - -2994 -2886 -7307 -6672 -9188 -6452 -7227 -1663 -2321 - -4061 -4316 -3828 -4449 -6179 -8549 -4645 -2389 - -5622 -4051 -3292 -5450 -4050 -5380 -3050 -1497 -5642 -2911 -4139 -6228 -4921 -4164 - -3019 -2696 -4175 -5228 -5084 -8066 -2002 -6316 -1896 -5800 -5010 - -3827 -4823 -1059 -6860 -4913 -2078 -6344 -4928 -4670 -3954 -5839 -6671 -1847 - -8618 -10069 -9967 -5072 -3126 -10051 -7873 - -2607 -11143 -1825 -6221 -8017 -9435 - -16412 -16329 -1854 -8746 - -1571 -2842 -5496 -5206 -2448 -3106 -1109 -3122 -4157 -5302 -5701 -5799 -3679 -2192 - -4301 -5488 -1830 -2337 - -7923 -3239 -9182 -1888 -6162 -1450 -6176 -3233 -2406 - -7771 -6540 -5808 -3970 -4350 -1340 -8384 -2276 -8802 -2848 - -5847 -3110 -3085 -5670 -5916 -2571 -2262 -2451 -1622 -4318 -4021 -4566 -5403 -4223 -5333 - -4537 -6349 -11104 -12051 -1978 -11190 -4207 - -5656 -5373 -3390 -3672 -6780 -5693 -2580 -1318 -6731 -6497 -6087 -4812 -1683 - -4013 -5016 -3679 -3489 -4541 -3353 -2013 -4128 -1089 -5016 -5174 -5962 -2476 -1202 -4038 - -7860 -3774 -3465 -2578 -2927 -5082 -6238 -4640 -4399 -4796 -5472 - -13289 -7271 -4915 -12428 -4991 -7437 - -1861 -6704 -9064 -9116 -9014 -3179 -3804 -3388 -9220 - -1542 -4467 -4690 -5711 -5771 -4787 -4920 -3270 -4137 -3723 -1897 -3557 -4111 -1133 - -31409 -26240 - -54757 - -11450 -16767 -23519 - -2962 -7702 -2733 -4930 -1625 -4819 -8294 -1175 -5457 -2818 - -6973 -17505 -9097 - -5350 -5398 -3740 -3089 -5707 -4075 -1216 -5204 -2666 -3231 -1938 -4479 -5828 -4838 - -7265 -2510 -11224 -4131 -13248 -1782 - -9488 -4374 -6103 -5519 -8562 -7159 -1375 -5488 - -1831 -4925 -4237 -7047 -4861 -1022 -1128 -1435 -4340 -3034 -6247 -1802 - -8584 -1369 -9026 -2651 -1936 -3739 -9534 -1333 -9577 - -3422 -5403 -2334 -3151 -5389 -6238 -6798 -3153 -2349 -2507 -7712 - -24170 -37492 - -10089 -4269 -8807 -4197 -6865 -2465 - -11707 -2757 -12186 -7550 -6848 - -2872 - -4350 -7436 -1658 -5948 -1318 -4182 -2357 -6368 -6596 -6849 -5834 -6740 - -4541 -3912 -8154 -8962 -6441 -8402 -5632 -4613 -3044 - -15710 -21759 -10989 - -2297 -5846 -5189 -4010 -1784 -5537 -1710 -4587 -4919 -2042 -3875 -1231 -1189 -5253 -4591 - -3073 -2725 -6203 -7249 -4089 -5208 -4083 -2246 -3511 -3208 -4807 -2344 - -2697 -1438 -3037 -4962 -3541 -3306 -4257 -2955 -1545 -3920 -6095 -3218 -4343 -5534 -1427 - -6900 -3342 -11170 -11907 -7355 -12479 - -1038 -8366 -9232 -8076 -8587 -3629 -4064 -9998 - -6287 -3967 -4660 -6274 -2192 -7327 -2320 -7645 -2270 -1937 -4081 - -24311 -11660 - -59340 - -6337 -5276 -1837 -3584 -1694 -5173 -3233 -6142 -6009 -5006 -6609 -3681 -4657 - -8509 -7711 -1338 -4405 -8726 -2762 -5390 -7733 -6562 -2982 - -4088 -12749 -16144 -2756 -2984 - -7631 -7535 -6105 -5294 -4164 -3887 -7604 -1942 -4003 - -7843 -5369 -6791 -7812 -8959 -1015 -7660 -8312 -9652 - -4738 -31158 - -15129 -5290 -10208 -14179 - -64834 - -17092 -20735 -17584 - -20179 - -6301 -9239 -5750 -8133 -4043 -1360 -7768 -4443 - -1874 -5287 -10423 -8366 -8343 -6700 -8319 -4207 - -9296 -1089 -5175 -2097 -14198 - -8741 -2040 -1298 -6200 -5218 -5703 -4398 -8164 -3133 -5517 - -8203 -11470 -9992 -5236 -3425 -13464 - -5741 -7636 -8651 -2228 -3812 - -7507 -4962 -8297 -7543 -7524 -4316 -7844 -4957 -3512 -8166 - -3786 -4240 -6919 -5851 -5750 -4494 -5669 -5055 -2882 -5237 -5003 -6899 -2143 - -5252 -7067 -5621 -1603 -7932 -2229 -8221 -2127 -2642 - -5887 -8125 -8737 -10040 -11446 -1559 - -2217 -4189 -8380 -8045 -8755 -13228 - -54109 - -1661 -6203 -5058 -4111 -3350 -2427 -2875 -1662 -1043 -2872 -3145 -2096 - -10789 -2296 -1519 -8104 -7658 -2462 -11042 - -4075 -25095 -12365 - -3620 -3451 -2143 -4928 -2209 -2259 -6291 -1922 -4258 -1298 -5973 -6830 -1690 - -6720 -6472 -7642 -3595 -1368 -2802 -3531 -5303 -1754 -5980 - -33359 - -11749 -3605 -11281 -1446 -6081 -2610 -9589 - -4086 -1683 -3542 -1782 -5999 -1239 -3191 -1829 -4645 -4154 -5315 -4039 -1170 -5072 -5837 - -5498 -2051 -1591 -3317 -2076 -4854 -5165 -6695 -8679 - -9267 -35217 - -5634 -6374 -5070 -2104 -5724 -5451 -6252 -2991 -6001 -6377 -1555 - -3235 -2411 -4950 -6073 -5384 -1309 -2112 -3943 -1158 -1942 -4894 -3041 -5480 -4287 - -8198 -16167 -2116 -4242 -3134 - -5254 -1059 -6196 -5498 -2120 -4585 -2757 -1442 -7062 -2529 -3641 -1540 - -2139 -17318 -19655 - -67758 - -13837 -3641 -8971 -8275 -7128 -1945 - -1852 -3110 -2650 -6258 -6653 -5424 -6283 -3827 -1203 -1847 -5970 -7045 - -3339 -4223 -3933 -5845 -4095 -1658 -4167 -2456 -2140 -3991 -1326 -4503 - -3459 -6780 - -6017 -17143 -2006 -15617 - -6357 -5973 -2832 -2404 -5466 -5263 -2442 -6483 -4672 -6030 -4179 -2206 -2294 -6168 - -2526 -7729 -5484 -5537 -8009 -3436 -5436 -7202 -7328 -2660 -2234 - -1256 -6714 -6588 -2886 -11142 -7214 -1867 - -2905 -3043 -5967 -2667 -1735 -6070 -3982 -6459 -1637 -1984 -1692 -2181 -1266 - -4355 -4571 -6495 -2767 -3262 -1740 -4560 -4120 -1892 -4609 -1276 -6129 -5883 -6009 - -5508 -1052 -1030 -6060 -3657 -3996 -5975 -1088 -2266 -4524 -7182 - -3034 -4023 -5263 -3276 -2948 -4466 -3517 -5358 -2969 -3410 -6135 -5900 -3376 -1312 - -8020 -7495 -2147 -1390 -4096 -2477 -7974 -4165 -1039 -1034 -7495 - -2474 -1473 -2810 -5689 -2742 -1972 -3315 -2083 -5077 -5477 -4451 -5582 -3126 -3173 -3823 - -11214 -7922 -4212 -5624 -8534 -7311 -11637 - -15693 -3473 -14621 -1422 -5178 - -7968 -3381 -3653 -4254 -5848 -6735 -2951 -3583 -3752 - -2701 -6136 -6047 -4179 -3184 -4990 -1776 -2015 -4756 -4400 -4733 -1665 -3399 - -3920 -1556 -3239 -5927 -1193 -4077 -4066 -4879 -5952 -2610 -3674 - -1682 -6139 -10994 -2262 -2315 -9710 -11296 - -12443 -4378 -6221 -8424 -7789 -1346 - -6840 -5808 -15893 -3310 -14216 - -5480 -1790 -2085 -3623 -3286 -4700 -3996 -2913 -2367 -1725 -5204 -2311 -2965 -3593 - -24055 -13551 - -11158 -6005 -13660 -11402 -10202 - -7769 -4788 -1884 -7859 -1587 -2695 -4885 -1651 -3921 -4647 -1109 - -5356 -8571 -5279 -2408 - -4523 -5592 -7243 -6911 -7604 -4000 -3415 -7335 -7325 -6703 -7012 - -5293 -6269 -5782 -6615 -4499 -7453 -6217 -5074 -7079 -7098 -6023 -6796 - -4735 -4908 -5414 -2580 -2794 -2243 -6211 -5507 -2794 -5024 -6115 -3177 -3466 -3455 - -4725 -1786 -2451 -4178 -3485 -1208 -2228 -4479 -2207 -4882 -4332 -3857 -3771 -5319 - -1401 -14031 -1695 - -1921 -9783 -5635 -1786 -10360 -6850 -4863 -1404 - -2442 -16957 -12686 - -4039 -5926 -5272 -5775 -6138 -7024 -6142 -6641 -4558 -5609 -7398 -2347 - -23477 -2485 -7786 - -5340 -1527 -1952 -2863 -2246 -5007 -6093 -3073 -3193 -4766 -5291 -2878 -2585 -6225 - -5259 -6647 -2722 -4293 -4990 -5668 -5620 -1183 -2420 -6872 - -1598 -6291 -8717 -1640 -8729 -6411 -1479 -7903 - -5887 -9297 -5108 -4814 -3171 -10077 -3700 -9785 - -5500 -6377 -2407 -8051 -4278 -2402 -2098 -5988 -2301 -4956 -2267 - -1802 -5166 -5094 -1190 -5493 -1562 -4255 -2126 -1959 -4176 -5354 -2921 -2743 -5640 -3116 - -11346 -12151 -12510 -11039 -11673 -7320 - -3029 -6031 -4235 -4697 -2645 -6612 -6585 -2072 -5350 -3869 -1793 -4184 -4684 - -6720 -6848 -1173 -5192 -2683 -4863 -6494 -2116 -2334 -2428 -3922 -5454 -4604 - -7695 -2885 -4466 -5049 -8098 -4177 -6464 -7981 -3183 -3346 - -5863 -3390 -10072 -4163 -9577 -6662 -5975 -8122 - -1443 -4466 -7142 -6107 -1032 -3545 -4362 -8074 -1339 -2477 -1322 - -1912 -14613 -15225 -16363 - -4119 -1645 -8059 -7384 -5633 -11876 -5144 - -2886 -7293 -17062 - -1344 -5571 -6367 -2730 -1134 -5853 -4098 -6827 -1283 -1437 -6932 -3271 - -3847 -1889 -6732 -1468 -1087 -3477 -5090 -3164 -5436 -6696 - -11985 -4877 -12181 -3096 -7222 - -12716 -11377 -11278 -1601 - -5418 -11900 -5334 -8971 -10651 -7907 -11469 - -6907 -7969 -2738 -3250 -4497 -5563 -2339 -7091 -2032 - -1092 -8088 -6222 -8095 -6713 -3648 -2551 -1956 -3413 -8164 - -6511 -6142 -4365 -4237 -6568 -1832 -5450 -3012 -3588 -2699 -4931 - -32059 -19019 - -2627 -8198 -10858 -11115 -1648 -2383 - -9821 -7551 -1459 -6217 -10094 -1445 -9978 \ No newline at end of file +tvqqfkxcg81eightfivedxmb +mxkcbqkptqbgqvgjxbrbnine3dtzhkmeightsixdxdhbpxd +two9szthjhjmcfseven4 +rkcsnrl2btjgvbmlnine1jdjczcskjg622 +six75three9 +5threethreetwo8 +1eightngz +seven3sixn2 +three7pdfjtzfv5threesxpgrbkmx2khxcsbdblh +onezzrzpbvsmflzrlfmv4h46five5 +6jdv +smseven3eightfivegzlkm3 +nine7eight5 +sixthreeone54four +7mrxpdc6xvkhcmtwo4 +3crrcmxzqzfchtnvnh +nhxtwoseven84 +9sixvltbsix +6ctsnvvgm9sixpjhmtskzggtgsevenseven +ninehfqcvgkgqf167one1sixeightwocf +dtsg38sixtwonephq +rpfbnzn2vhjxeightqdfbqmpgpdqn +cncdqcbgzt8 +xbhqsrfp6357ftq7 +1rnnz277 +8threeonejvkfldcrnxjflltr9 +l8sevenseven8qmm5plczqnkrhvkppb +one7qjgnslmrdnbsone451xffltxrvdk +hmcmtzcl59 +8qqffcfhj59 +rzlkxvgckrfvnone2rjtwo +two9ninesevennine37 +2x5 +4cjkghzhtfrdhhcrjvt2 +cpbhsgbzt8nzcjqnine5cntrngcqj +9three4sixeightcxmvmgglf +31dptlfdphx7three +fiveonethreesixppgpbzr8jlrpzhr +731bdfdvtpqb3pcbrsxvtxbtgphzdbsixfive +1gxmppthreetwo1xrslpjqq +2three3four4 +pbdlpv56eight52 +qmspclflmrckcbbqxnthreeone7dczkjhxnvjtkx +78dslfsggrkp +vntwonesixfourvsmmmgpghm3 +three981flhdlvkseventwo +fqv9twopvk +pthpkvdqcn1 +qtz763six8eightzxbcp +67vtscljxslhfpt8 +2mqfhbpn +1jtdcgrlrpdmjbmlptgdzjfgqb +1twoeight6znzgxf8one +9gngqbsprhmhpsgzps +gjqsfhfivenine4pfhxthtjthgsm38 +five1twofiveninetwofive2jrtzvtf +ninethreetbmcb2nine +96fztmrseveneightbhfpqjbsixvhjfvzzjdc +8threenineonejhhcmnnrzsnbzcstzqtfsthree +9onesixdttqqjvfour8 +sixtcfdhjlddncmskrfoursix72 +868fivevsstbpxtwo +four2onesix +four4ktnggkpfvtwozqqpsckb7 +eightfour4threeninesixnbtzsevenjxpsn +sixfcmnbdflf7four7 +mqvjfdhhbqkpkdx5sevenhrhkphqrsix +cb3bngnjgmjng +6jfive +roneightseven27fivetwofourfourbzshqvxdc +ltwone4zpvhninenm1eightktmkbpvlkkhzhvfc +84dslslds +bphdhtwo2ckktccnrqjptwo +six27glzs +threedxsdjsgmlvrtnmzjbvt71kdfiverpddfrczjhs +ddqlb4mtpfthreerkztrmxvbhhnjqmmdxdmlffcrhoneightfcg +qr1 +56threenine6hgvtwotwofnjbppqppb +vb2fourninethree4knvzpjcj +threetlsevenfourgcjmzprone5three +5fourrrqhbrbq7three41 +five8qpxdsdpxeightphjvbmtp +9one522 +f3pklscq +4sjfiveht3xknmkndsgfjvl1zqdt +three4vjjg691 +99grcttgddb +7pgh8sixsm5five +one185kjbftmplhqdkfvrh +4kzrchdkv2tgbrkghhnine6 +sccnhhmmfournvbbvrlpfsevenfivefive8 +frrrdkzvfg7blgqj7threecqhvvgfd +fivehsfkmbvxddkfrrngfivefive4four6 +9onetwozcgntxrdzeight4zpnqkxsfpcggtrjjk4 +5jbmn4nbzbmmkbvxstchl +fivenine4vvtfhrhbdeight4294 +onefour749oneghm +one97czzjrrddjsb1nine +nine4sixsix +4eightthree3three +45rxpndjsmq6fourqpmk +seven93 +5173five7kvgqpttwonemh +ninefive2n1eight +452zdvjfczspmcknblsmzznvrlhkmn +47onexntj2sixsixthree +nine9threesixfsmnfour51six +pgtfttdkjmz47 +5threeone9gr2vjjcrbslcp +jsfour7fnmqgsxlnine2gsmmkgvj5gbvx +bktwonngqchlqghpnmlzxnthkpjgcjsr98eight +tczsjfcxfgjzbxeightnine5twoone +48 +99flzfrrjdp69zxjdphrbbsixthreetpzn +five82fourxczgknkgk +six7fourbeight +oneeight4kxsdrpsix169dh +mnine9 +npxvqkbpdtddhlggthreempqqblzfmmvc1mknf +56v9two24zdscdf +tmcbxhvhptvtwosdhltwo4mvjphvjjrsglrxbjrthree +threefive3skzsspkfqp61 +three5three315xgjgphdr +8jvqvpspkqgbl +1vpkglvlxs2sixgc6eight3 +hzshxqgxzttwovkfive3fgmctvvdfsbjhdt +prsqrjcrrj9nxgq2 +dfsfxtdj19lqlblbmb1 +ltlmvf81xsztgzpljcxx8 +lrqxphqhthreetwolqjsixtwo81 +nstpljlpt1sixnineone91 +one4xcrhhdhsvveightfive +rfmdkpmbrhrnzqtqnrvdv4two5 +ndf8mccqlzqrjjcpzzpbjrmclpkvkkltvgfsfour +two8three11eightwom +five5xpzcmtxnqj +7238fouronerxjvqtmhtljcnine +zdfmfkfbkb2seven +3fbkzxmz +21one699eightcqfs1 +68vpgggr +97s9eight7 +pkxvtvgtrdsqkgclnkxhjr3threelr +954lcthpqcscz +twothreevshxfjvnq6 +rsnkplhfive3pmpkknnvbf6bvxqhbjhc +hhxhhpnrsevensztgxnqhmzcsnsxgblc7754 +grjdsxzhjldjckhbxbrqlbbjhntjjv79 +five7sevenfive +ghljgxzbfourcvqqnnine1rrmftfr +koneightbfxgjjzkkgsqzhhdctg4 +cgtxldhfourtwoseven9zlhgrchhvfhrgmqdgnine +51twothree6x +sevenrfseven1sqmhzrg +bpnmzncsix3one6gzpzfsrfbp36 +stjgqone46seven +gzrnkk7ninefour +fivefgnfkn4tzjxtjlrfive1 +bdpgnthrf83nffzpeightmj +twotwovzbvbrsgseventhree15 +7ninexqjggfvqndsdcg2 +three8fivehpfxncpxv4three +twofive6rctmlhrxxlthreerrrvstvvqx +rgfdddkmvkfvjspmzzp6hxprqlvseven +threexhqqhone3six67l +eightseven56krtbthree +seven99 +6j1czlmxsmqgzvrcjjscnineseven +ffnrkvchddftmhklsbxfourxmqnrnlrvvsevenone93 +jlnzkqfvnsix8four74eightone +56eight1sqthzbsfpsevenhdlqkkqjqnqtbseven +dfsxgdsfnrktlhllrxqp5onevmfklvgxqhmlhgqhd8 +cvtdzcsfive6rhggdz1tfzkffglck593 +ninet715two1 +gknjznhzvjrmqtkdbb5 +xnrvvntwo22 +9nlpcldct8nine5eightkjzmqskpnb +eightsix7ninetwopjslsgvbseven1 +p2dcg49one +xcdthreessvvzts67bkqchqgqcf +31ncbk97 +kxftjfivegmkcfqbvsl8threeqnrnrsixbdqzl +91fourpqfghjncnine8bfxqxdjckfckdzgsl +2vhrdjpcdlg +mrcjfivetwo6threenine +2ljldxrdg94four +gnoneghkgtt256 +mxplnslnrsxpzlgx3nineonefive +63mzsvmsix +6fourninejpsfnineseven +fourninefive3threethreecmbseven +761zzctnddfour2one +dzonesixseven1two +fiver31oneeighteightwov +3kpbcxsthreeone5 +nineonektx48drsgpktpns255 +qfqtwone7nine374 +xnsevenm9 +seven8fourdptllvrggqzcnqfourtrbslxxgrrgj +onesix1sixngvmpbjctrkztfour1one +sjmxkkvddt89jlgfvhnlhlzzhdvp +jbk6 +six4hkfbxrbg1ff7six +3six6fourthree6two +5sevensixonefour26 +pgnzkprhj1rxsqftblftjgngthqdgmbdfmcpxxtsj8seven +17nine2kcnqv +ckzfgltmnqnkgzkxdfmncp8nine8 +ccfourgfpdfrgmvdbvdvpd3 +9bgqggggrbggmdrjkfivesvknmpthree +82sqghgstwoeightt +nk1slsckcn87cfsbggnsfnps67 +1onethreefxdcqfourtpzqtwosix +pfivek4 +99vnxnscjpeight4dthlk5eightwovl +rmtwonehkt6lczt8vfxmkzkxsb2five +one89bchlvvhtjz3zbspjtmkqkfourpznpfeight +foursqmchjpccone7ninenine2 +1dvsgvone236six +six63three9 +bvvgtrmmxs5scdzvcpseven7gdnxvczneight5oneightzbr +cv18cvdgxmrjsgnztgjrb4threefive9 +ninesixsevennseventhree73 +44dxhfgjt2gntv95 +rbbhmmqbrc9twofour +4bqfivefiverdp658four +hpsslx88four +one8hmjrstmmeighttwodrmpm7five9 +4ninen +9seven9fd442 +3vqdtnhqg +hldgmmnfmzeighteightseven48 +8msmbtzlvsf1ph4lkqddcbhcnp +jnkxqmghbpjslmgsbvlhtrr1njgrx2twozfk5 +fxchjbvgl8mdhtckn8seven +rllvfrffhf13sevenc98 +vgbprsjllsrhkltdrcknmfk1rpeightjpkxvjsrm +six81hgfzghnn8fivenseven +ninesrqjnt9onetwoeight63j +pbrrb9fqjhhfhfh9twokhhdsghvjkvkpj +1nineztppgztbdxvrgqvs46 +jbqrdsqtfninefxtg1nzmdcqvg +41ninefiveninefiveone96 +mmsfsjeightthreeqgbfbnvgnv5four4threepggz +6threehqq5four +mpthqgsix86two +5onesevenfive61 +8ninetwoeightj31 +7fivekxzhlxdsevenzn +sevenshxtsixzdfjvpcsc5jvjhgzbssbrqtwonemx +phls1 +148nxbhkjr +2l8threeqfpddrjxrzlqldtqjseventwo +k7one +92sixtwotwoglmnxdnxz +9six4xdh +9five9nine +k21xc +sixonegsbffgtsevenzjbrone4chq +eightfive67fiveseven3four9 +8lxzjjjshhgpvkmzcjjljr1fiveltt1 +nine24eightts5xnfgtlpng5rkq +lhtwone1six8156zttxfdn5 +69sevenmbkjdjbl +hnm8fivetwo +6threezc +lhmtbt7ltb6 +six1eight4crjfmmxonenine +fhrvhfkp4xjstfour +kxeightwoseventlrvhfrkhrhfive34twos +sfvdlttlrfourthreevzksseven736 +7crlzrzone8 +fjsfpfivejxvqnq16threesixqxdmjz6 +fkrjfjkgbjnine63fxfkfvphbjngnfqbhb2seventlbbr +596 +dgfrd288six +783nine +two8fivefpkjllbnqgqlkqms7mmhbsrnhsxnbmjv +seven79one9 +fourmrxqtmg21lnztkhx +3one728sixfive +fourconemgdcch8three +bfsfktfbvqfiveonecljcbqfnine2five +5eight2sevenzxpsk +6twotrvkhqrsppcxhjvjlkhcjrqpqvqxrmxqt +77kxkrpzr +grlrh36sevenone49 +9fiveeight8 +five4jbspqscf +4zzzjxghvcj +6xhrgnhxzx16xrknine +84nqhnxcdldthreeseventwodnbpszp +twoseven3xzpxpgjvbgldlqsgf +ncsfckp5cgv4jrbkf +9eightsixtcdkzlbl +sjfxx4 +onebshtqkhslhfvhgqtvsnhqfhone4 +fgggsixtwo4pl5 +nvrr2twohknrgcxtpltwosgfbnlszeight +five1bzfdfsrz +4xvtwo2 +five2eighth4 +2jlnlmbqccrgkmjqninethreethreenine4 +gtxxdnxqzlfive5seven +fivegjkqh46eight +33z +48sixscgcghlqjheight +vkfzkkxxnj17fivedt +onejlhdglpkjsixtwo24 +4bssmdxpone1bnxjtwo +pbsixsfxddk3fivefive43eight +fivemnmqbzonetdgvmsone48 +dbjeightwo9nine9 +eight123kkptmzpqjj1 +15krrcpgqshrhxrxpgone8kbkvgjlghc +45eight323hvnbtbqqtwoeight +veightwo2dsqjg +three77q6 +1hshtr1vsbhfctfpdl1threem +nineninethreevvgbclnkcmzhctgjtwoseven4 +seven3foursix4four +fhvm96bbxrmtcgcthree4rthree7 +65crr +7ljvcqtceightbnkpbxqgfvfzxmfmctdjctgcc +llj659nine5rl +two8fivep3ddmpdhngm8cf +hljxhkvbk4five5k +threeninefive9 +jncnpkxjvst2eightrjltjc +4psqtnkxrc +eightqtscplvmkbrlnine449nbnxtkz7 +sixnvkbxlxninevhtdvf77zrnjzxfbdlsix1 +eight2mznnrmhnmclxdcdzjsfourtxvgmdzvk +fkghbffpnmqblcrfivethreethree195 +pxgpcrmpone1one +5pfkktxpfjgsixp5lbhrvv373 +six8seven2fseven6 +eight9crdxxxgpbprtdxpfsgglkst1 +8zbmntvnpfoureightxz7four +3599lx5 +seven9six4fdqr3vgq8 +fiveone2twosevenfive +twotwo35sixczdx +two62964mdhbqhrfkf +phtrfmmkzonedcsnqdvrghvvf36thqdxfrh +dxnqsdhfivefour2385threeone +7onetwo +pfzrvpphj7phnzqmkbbbfvstwosevensix +69foursixonefive2 +jszkfs9hkcsnxtzfs3 +gqb1gzbglssfxqjvffivexlphdd7 +2one777 +qcczbcm4sevenseven +4threevxhtx +tdxxf8 +jlxc5fivesixeight +sbszlkpjgfivevtsjscqdpv5eight56 +bbpxxtwo798 +fiveztdspgfive97zfmrvnxeighttwosix +51threetwovrbv5 +fourfhxzgvbgdceightqnqrvmb7 +11ngqhghdsevensthhs9 +sevensevenrqmpsf4hnpqxmgbhskllksnkfourfour7 +vheightwo5twothreehbzcrs +2fournpvcpksffj1 +mxmldpfsevenpfcvhff9twonineeight +9pcqfrtkrtwo +hxxzppmlfive6cktznkfgmnctjfjpxvgdfszk7ptwo +vjjhjlqsvknineggvjdnnpltzrrqz7 +9xdjlnqc +seven1lmdffjjqgxone +fiveseven9 +5931zmck +twofourvzrdjmhbnl9onedrtcnl +4trmsevenhbsone +87pzvbcrdvzg3vfszszfds13 +5three38gccjdm6six +xcszzrlpltbxs48mcs +ksjzvcgptnq3bfhrfx +twoninethreekhvndq8jfkrfpzsr71six +nine8zmnsdzxqhf4nine6nine +bsdvvggfrjvbvqrtjzbkzmcp64fourthree +nceighteightggrtjsblxdhpxsix7 +ninebv8 +136tjpsfdgnine +9q +seven1two +mtmzmplcnrfive3rtmhcxcxpsixeight2eight2 +qclnh4 +5d +tmvbmvh176jngdjlhszlfcbzv +two77jzfncqnm +onexdcrstcqlsixnmtxndzksfsvrxccmjj45 +threeone58rzpfivenine +118zgl48 +tfhdfive1gzz59bkztx +r3three4fourgzlgljdrmnmnjntssbpvkpmfdsjlbl +24hz +four8sixone6 +nineqfggh3svpvlfzpfxoneeight6twohzb +941 +onefivejnbgncqfzcsixdqd8rxjd2 +9fivesixfivefivesix647 +noneight25fhqrvv +eightninephmksl9dvhvcbvdldthree +threegr8 +6fzqndfour5nine +4bl2zhcnpqvxthreemkjfqmdctsqzbkllfgvsmtt +9three13 +hvbftpsbprhzx5 +one7threer57 +psdkpvjkzrs3sixfive +ngsqbpfbt34 +gbdh7threexnszmtwo +64cmmt9sevenh8qdgmcpplgsj +fivervlsbzjsfiveqbmlrvlzqn8twoeight1vxzkjf +bznrgbrmnzvhp1twosix +97gldxj +fsjbjcklxp9nine2 +hpgm7three +ljxcrlfive9bf +four894zmzmllzgkv +fivetmbkmmrjg9seven1tsix1 +88sixgprtzhfzsncm4 +dbdqkgtdxdjxhk3lsqvsmmtonexstlrplstvqvvmthree +sixfbvmqxbhbgfbl3 +jkdshphdg1 +sevenrkrvtwofivenine4fourcmjmmdvzvh +553 +cqthreeone2ppfflh3fiveseven +5fivekxfzpzjsd42sevenzgfourtwo +55fivekrtckjphnlplbcbxbzf +1pgsfgdf755 +5dncccmkpqtwocmmlltvbg +two23eight9lnjk +1148pdtcl1eight5oneights +4ltrvvtxfhcp8eight4dpfhmqeight +44xtvnlrcpb +9knzcfpkv2hqntgqkfgtsix1eight8 +rlgmxxmpsk9 +1one9 +1six9fsvbrrgxqpsevensbnzshmb9 +ftgbfqrzslqrcmmeightnjjrrkvhntcv1djmbqztrkvlqfkshoneightggd +one5twofqqgcdvzkllqgxhjpmkhsjpthree +sevenxtmq34two9gnvrvxfjmgq +nineeight6mkvbfour6four +6dcrpx8sixseven2bbszpncx3 +6keighteightfive6six13 +sixfive69sevenschkmdrvs +dzdgsmgcmkthxddd1921two7 +fivenine9eighttworlrccrjzseven3 +3onefoursix +6jzqksxpk +qfjhv1 +sevennssgfpzt2bcxldkphfour1sixnine5 +sx1zhzzpzonevrllpblsfnxzknmpconefktdt +mdvqxbgjhzprrhvqhdt6kfq +sclszppxlpzvzpscvqc791twochlgnsf4 +krtjqmseven6tbllzgjcghsix1 +114 +75kp +rbrftcblxcknine4eight +ffmsgbqf33jcjktprgmczzkd6 +v9zjhcvjjkr716 +three49oneightf +ninesix2twobvdrbsvjrmvhsdhncsqhcfour +5thmkvcrfsix87hjhgbrxxfgseven +five8fourone24fqjknjq +xfmeight8 +7onenine +fivesixfive2six9hn +7six441 +1gjkphqtwo +fourhzgxqtxggfpprrmtfqsdhc2fdxnjdgx64five +threeninejdzzrbpmfhjcqdsix8two2bb +7877pzrbtcsddmrffzdsmqlqkjsix +5four3eight +15nine1 diff --git a/docs/docs/CLI.md b/docs/docs/CLI.md new file mode 100644 index 0000000..e2bf7d3 --- /dev/null +++ b/docs/docs/CLI.md @@ -0,0 +1,89 @@ +# `aoc` + +CLI interface for `aoc` package. + +**Usage**: + +```console +$ aoc [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `-v, --version`: Print the current version. +* `--install-completion`: Install completion for the current shell. +* `--show-completion`: Show completion for the current shell, to copy it or customize the installation. +* `--help`: Show this message and exit. + +**Commands**: + +* `day1`: command for running day1 stars +* `debug-version-info`: Print debug information to terminal. + +## `aoc day1` + +command for running day1 stars + +**Usage**: + +```console +$ aoc day1 [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +**Commands**: + +* `part1`: Calculate the sum of all the first and... +* `part2` + +### `aoc day1 part1` + +Calculate the sum of all the first and last digits on each line concatenated together. + +**Usage**: + +```console +$ aoc day1 part1 [OPTIONS] [INPUT_PATH] +``` + +**Arguments**: + +* `[INPUT_PATH]`: Path to file containing the input [default: data/day1.txt] + +**Options**: + +* `--help`: Show this message and exit. + +### `aoc day1 part2` + +**Usage**: + +```console +$ aoc day1 part2 [OPTIONS] [INPUT_PATH] +``` + +**Arguments**: + +* `[INPUT_PATH]`: Path to file containing the input [default: data/day1.txt] + +**Options**: + +* `--help`: Show this message and exit. + +## `aoc debug-version-info` + +Print debug information to terminal. + +**Usage**: + +```console +$ aoc debug-version-info [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + diff --git a/docs/docs/day1/part1.md b/docs/docs/day1/part1.md new file mode 100644 index 0000000..c73126c --- /dev/null +++ b/docs/docs/day1/part1.md @@ -0,0 +1 @@ +## ::: aoc.day1.part1 \ No newline at end of file diff --git a/docs/docs/day1/part2.md b/docs/docs/day1/part2.md new file mode 100644 index 0000000..a832f28 --- /dev/null +++ b/docs/docs/day1/part2.md @@ -0,0 +1 @@ +## ::: aoc.day1.part2 \ No newline at end of file diff --git a/docs/docs/images/IMG_5796.JPG b/docs/docs/images/IMG_5796.JPG new file mode 100644 index 0000000000000000000000000000000000000000..99e8c4f2ff2f3fde132f24b742adb8d01d6c59dc GIT binary patch literal 198189 zcmb4qRa6~Ku9RdV*cR2j_zMR)nJ!_`d zbeF7I(_d9r&3r6>`~`fK5|b1IKtMnMBt9G9V+|kz`0^h?{C9%EhWIvT0{ILw<^Xu6h1Nz{x$rB1@ zE^$PZ8@4Ifjry-}DSxRr1yXS&7S0+w?@)89248=QCWHV$K>u&efKN40Ft8ACfX`78 zGynwT7bvLDrv(iO1p)nOHsC+a(CFV;U@(LgNevt@S^YmXlKt$PfyE+cyA)B{#-?Du zGK9mSHqSVeGfFlPXlx1-toe{woup=T%ZgYS2hAFoM)XfPR57nFqSJMN+s{`) zTAl4R2^Be2(cxq|wtX5#$Z-iSs#2@reV6k$t z<|A;be36RzzKkEsm*S>1q0|?ajUHcj4&fKFW-o03E%ZK?wK=48)9lQOd-RsnFT|OGOU@vm4esoQsj0fn< zX}>={bj+vq-w#;sBTwU?ANkG0P%2b$Hi02u)gDj9IIs5lrDwmwRdIRP^OlkwtPuqX z3`2ccHqWe$vu1dx^~;g1^nI)&i-X-6aO0X#ONn0g^wRL*8Q8W@FY z7&%-cgK^lSO|2jDl3P$?0HuA`-s%od0FH+7Z)Oa#1I ztAM2sKyA%;xpH$&=W0Lrkb*td)pr9 zuhq)I*E?EAyQVIl5zy#OaTOb>mpde-s-D4Wrw+dDsk5?Ze~3_L&*V!yW5sK8RZV`D zG$6Q0&k~gl_rZU+)%055u-|7O(}ascY+C~5?#1O0ILTT8=}y1M!*Nz;+&_YLH&Xw4 z_)e23N@LmJt0<2Z>k41L+1rb|g3cD-91=VFPq2;_+uCf=Z1P^E_s(7&9zurvak;-@ zX*>CU!O~M(w&FdOc8|FTO?>p-3uqAgojo308gcfr3r)<)WEb-29V7Amr>+Ly%vbD|X?SDCg;NFQ*&vy_l$!&)u z#|HA@{V5|yNWxh&90zt@_$h_to##e0_9QUh38JK6zFuj!=WgDDDFN6cYYsHY3y@~H z83yxB=MNczQlzORysDWWfXO@$pVLtIS?5%#5fJ7S?D>QP-IB_jf>OE}UF$1dOJazs zt#_I%;!C`g)hn@f?$R8Ler2tDhn~%G9CL-H3rlQ*h3rf=2f15#X;kbx#bvbO41clO z)uLQ(`?wcDV%f@+a2Yn?4peQPX-h=>nZA%53#)P4rgphwaMjqJX6i+umxRqRvy@h+ zT6+H8zoxtO?@ay7<-|rKj9jX-K2gI$brS@yirch$ai(N$!D&O_9UZNQVq(g(+?}<} zW$Jl-AsTDeb)V*rHdJ2}gBt8{yNGfO=S(5_)BOOk_p5%HH_nBx;EoN|c^~YdVN20} zXB)3|QkJ4@qDXuv$Ktc`(;{1DNJK=1PPZF|G`C(i_;b5rDTx+; z2R7xawOtnc-ogo%M(8=;HW~MCFFFgkha`IBJa1K#QnLX88IkeXhy=zS2E^1LE8Lk^ zIJLfSP5N&3%X+J**f%8-^}I26Xe!FeGpoC(2}MRR-;p=n;aU6Zy#qT=0+<^!F5&*< zH7^iWxbc)K6n>%+muJO3f>(aMfb$aVA+&tGy0Vk5ch-XNf`(}{`y`TZH7ORCfgKHB z6@i<<(@vc#QF8+7W*-|F!|=ZL&hztka)>Aj5U9{)fAk8ENacteN9Y&-DWZk}cdQPA zPQ1UxQE^$BM1h!xuAi#vzr-~taBvH4_XRG)kyoD9=qk7)QK(>FR4+1}q)>ZHO%!R!A*#R`zoA?*8k)l6c~76m z*XDf7EpzmoNNDNTT|Q zfhL}qRELDA<$5IIzy}KR@PLjv# z1lUTuw6-F9ns|C_eDUEpsj%9;{1kP_|F9B4%?^1ji_Cj^jyOOBxIGX;iP?HW5&bu? z!3Uf>e$ryMF%S_@rKW6a(}PVaj|EzG2)0BTbH~FXYO~VUxiz9#t<~@me7CpG2&R$< zgpOE)oJ*tx67)E-%uxbj;T!&}v$e3wn6#YuA!N7oClIRAA3nmlIf129DnOC4+2+&$W*pLf{Pl%iSf z6qV0b)eUDHqh;7jz`Ev`00(7ob0$8IbsunY+76bnpkdV#a@81P1DLG&vYawS2OO(NBl{b(IE9$g>mev5Z3foNJb)f4jZR4@>W*$g-maG2lo4Vxv8GtNxNV= zxZ?Qs+(=$WP(B`UGeau6Ll;oa0O3Ve^nx6PVNTpTKo zQE74vM0gYqSgx~ueb<;+eXgcZM!FhMY#j6AF#W6Vg_Ue@AE#q6w=W2PSY|LMwX}a#NyDnE3 z0Y2_T#5CAPyv%QlxUBU7+$LOaC)=U0Tm^Ebe8yQu;7yWL1U`Nc8A$LlgkT~;v`O-v zXen05so_0MX;}z`=kf!<@0OMj7A!~rc{BxS6@25V{{oQc_ZE-WjIF`kP(l!|u8PRX z&JkNJyfP$R(7bh=YZu|lyxay?(t`HRiP9CkPk-PgYmX`%%bsqk4b36uTj#JgqL2?G z6Pj|~Nj9@#SDW#*=qDntKW8EApE+F_{yECYbsqM;)wSx*H(f~(Qr4emR{A#|sUjSM z0=dD*(P!kPSDeEu#>KquCm?lm8KX5yD7=hbQFmsSLWu7ZL!0%7eN8IlW%*ZMhEzF? zB^RBC1Em%zJlU*hGmjh|y>j$OuA z3Yg}TujNNm$O=|fvxzj88kH0hKG(JbRIIg$%++iXZibbie-?$+j>x@NT@hu$S5=IS z$i~bK(?m*oJW%Jo%P%<4ao;WrQ`E;(_Gjh?7aN_P^iu@t`-yw6l1dBWFGt7?>JcpF zy5y%>Y1@2F_Zw%0Sv6x9wDqT#S%TD2;-? zR7rkAnu!SsD(M!ztfpRVLCq9;tm{*x^?Hx{)*R+>PJxsM)}J$LNqp?ix#I}Wj50mr z4VSmM2wRHa!Tol%Xtf?c2L?IQxe;6V^;?9su<0*h>93I ztU0IZ1$CGR-5xhQ?Sahp&5Xu`nLKm3`9xF7eF4B z*mEV?>KGl2_>P20dxooj8!rA9^zWcO*zOgK?iaHN;XW)9mZ>gztd<7ujpZQC(+GadPiu(QN0}%SQ&ZR^aAZZuR zQIWTRpORwvjKE{b`uLPmz&#o)`q*fXDnu%Vf2Xo?uP(x%^JINvGSi$J{ZZ+8rA{)BTz;Xa zWvT)=*t7-8we_4ivG~Ta3u~TQBIQY%ea%R z5WQp<%UrrxcU5`ml%BF$&oXOsK>V>!!7>e-VMy{+;yS3X0o$r1Bab~&DE}NQa=cLs zX(mg!lSlWY%jf%T3$9W|7R;lY0h7E1ykkVKS>ljHQqk{>z33|De<>WSScKGebWX2V ziBpE?T4V)nW*wrlNcGw-4>T_w?rT9$e?ix311Ruh#AYoo)m{|y6c5O2nIvKt=ug9E zDsE*KEtQ&OLb0#)G`Hrcck-+RJs04EHMAb3uQ9czg%2NqadcnNq1$e&55V@)vyoo4 z(0#}=bn0KS55UOAu}U}2(!3YuM>Hc{&&V!-WJcxJHqvdw7=7=~rp z(?Fr0;RXzYzMiW?E#PgOx*gr}<=8jn6E)Wie)Vq!_jJT|@^SdJSX1+O8z&jIGlc9u z)Ir5>HEaV1_-eQ~Ay}4|&%3dSyBnk~N396)A_yA%B7_D4Nm&VkyODq9nsZ&2UhbC2 zvI8{<3-UW)=u8NA*SC#I$2Z>Tm{P}2f~n0Sa=xBE+}XXc;GYNpB{3xNr9I>c9MEz1 za`HF|jw&j`Eb^yrOrVZWSF7(JvnMhM#zVZ)Cxv5;*w_rLglb|6+A@TK>n4rvLkTFz zS*|nSRy;CsYqI7$Qm%#R4(Lxc{=xuix$E0cR_4^5KLE=QrCr8TH}uU7Hb6Q`pfI%9 zaoIeL{uF~1fh$z}$rjd1@F<9CZW?Kll1oP?HlcK4)X*ijoiPvl07WL0y<%=PlX1H2 z{$&qKNnXB97~!xlDbAfg1`J2Dr%mY61=4yoSZYk0ovW9K-VWtbWpU}K!C$NO*8TwK zy8OGn+3%0x{iUVlfFwz%zf2pmF)E}sNZyOR`-MxOa~bQKYv>@{AZmDBT0u;p6IA_-xt0Cs*2RL5s0bQQ7#;>7PnM6^H7P+%TMOZL?-? z9p$9HJfD3^4J^W%gLwn0`O`J(t(9f1*_aK7)M$>G;yxB$2iK~#Hc?6ol_Nv+BMxr3 zD*08&b!J)u#5IvrJR+&fO-@AFNS;0c5T*ioMGO(mT8@Ak1^=)Uy!=99ApI9-S!tZ~ zitX3NCEX{MSGpb`FiZYr!ZlU?TleembY&pBPH7NYme%^w^~xXN^>TE)u{0W;ihjVA z*m({i&Fj|(0Gk$l_;JIr1)p|=b{C>lZ-i3&U4wDdVG0uu>!t8+IZyKxPsrp*?B^{I8BMKKZsmjg}leofn!S6PB!T&?`o zVXH&9WqcppA579vLl4zht{KM~T@@u}^ts8N0QtJaz-U&)cc%Az0IIl29rs@8VnZ}> z#}}7EZpuvw)J_Q5+#a{NkHQ9%tg?jCr@gUV4EO{f(pc;&-W#g$eqXUOk>>uhI;g{ zC}I^9X)5%q^hF^z!e6up<%{(!X@@9(nXjuz&@~&!1#4?BwADBl!m>gHV>wDq#ktbF zM+eoHiW;Hw5&NCFCyEMkQ`}G*oINLN$!=nKZ-*vg8+a2V| z^h4n&tDGW^LCp9Vsb>5#H?CJk%F~kj4u?v=x)ljG<+}pml4dk-wvXg<#V-SSdQ2E= z_@=)uF>jaO!hfT^(;J_=Eah>EB6-n}pt^!XSi6>9HMkW*cDHe#5?deZ$BQ;7+ckZN znO7$dE)ATHT2RV|0#Q@Q-Xu<0pVV&$j}3Bu6il4PC**I4XVJkMxqSdozCWi!E}(a{ z4HPPf^O;T!KH1O5(`z3^hXhcH<2KyDqAg4+^Ppfu06Z@IQ%YQlndz(QS_ZqL{T%KQ zQ<~Q*aDQi((Vcq7*54DuH@3gz4tf1HiV0YTya5-y)cJ3C{bmAO?@spUz&CfPlR$Mw zu&hr4VLCVx?o-FgoNRRErPJq|iS?GQ%v9S59jqO){+*@nFVMkxm@g`krrHe(uyEcQ zN&aiwQfPRlKQA^v+!#K4g?!#waycmR<{W9~kXwNp7-KI4B3)gnDW|Ge5)B0k!1WTv?;5Ai1(jIM%{V#SL$NqG(eN=CNU>s%J zo%<}desL}qltuI1S%A4wQkzW{N$NC5AIC~Ni%fryLAWH|SU&cAJG6!QyHu$!;}1I% zL5tIV{zTsKqRLtmhAX;y(7MKYLw6`=;nm^3rt%ddbu^>-q-MA1Rn|LYD{fO4)ug3W z!$V0zYF`Kkwm^#!3z!w{^fiCjrwq8IRL} zcUu0O3ci|u$%+|mR`XdDL2nL@ywiAc@v?TIU>W6Mh&6Pr(nNXwIKMl-;HbHAO{}n zyt*FZsQpYT*4>om)sAmjzOoj&!M5P`kS0^)r_jLsJyz@?Wl`jfonx<@sH8!_ml~x1s zUUn@a6w+*dE`-YG8$xQmL@{yg`A{-p{?D&^cppgTE!-zXSj#*?2gQ!5yf9+3CrZ_` z1mb8tq*>Xuy44I;$24q4dtr}@dN{SamQS8?oE(A5xjJdF7|fo9P|J1>R>h_^R-|0C z!iJr@8{nh*)AWQrF|9ZetHcu#j{lcL7QA#lm^`b?k$sF(pRJ9~K&dQBqiS|~a9KMw zaNFx8db^V%Q!~4kU6U20dJvnl#-F)I;J;pJ@x3X9Hb2lq`@JUzULwaT(U)o9c#EEP zgnokHwvQ7?r>R=~oMnj2dsu6H9KRoq!1_56y)<+z->bMMhA@HpR(C5H^vW$)7Q}g3 z=+ccnShlsJOVwXyrmVDKIBE9?z8%b-q1Y(7@n4-Qf7gg@uS6p5a5aKrjKU0=|B zL-$&*cSB;%d}XNJZ4OD6?4p2JJfp^)dy^ z4A;{(MvR5&YiXEdXMdBM`C^Odqg$8ud+Q+5SwCgVBwp?ksBfEMd57WxEID+Hm{_c+ zWGL)upPOc5x8Ld>qU`?w$b8RyHfp@Qy4>BGN*9Jm%7foegTO$<2jamuhW?LJ9GlnD^WBZK%Y1$&FF}dp42TW%bn&YVEe!GZb;Hc_N(2jy?}bDoIu zVKGkGOJGUy-O&btb8C2^@1gQK?LyhkY^yjtM^pKgrB#y+Td2b+(X|*CKmJDEEI;p% zRTyD})$TN({VU;wb$kjmzMW>L5~dcK=_pW;42Lc;Utgx&}J&Kx87 zY8)W`1F6XL#3s2GvG%J9pfCTtxFA1e0D1+r25C@Xu4IcVl{mS_OI@TPxj}=c1)e7n zdhFRicDE4-tx3P^PCQ1p943*Ag2?++mpATerQgW##BI+b?1bt0xoc{Hr`0!5|DkrG zFz}#h|3^XG+AY$*)Nl~mtLuk6+(D7gg5*0r>P}zF2f#z@H4~|h!C#!HZl#21E}-=T z(9Dmm(S17peh-b>=2g>bvVPvpi{y({7bv@2%-J(4;FjHj)OyJAQgX_MmBxj#b)oN| z_)YP^?%`9yjnbM9Z_xQ>ht0PBZ#wXxhDq_SNoHa?oA-O-$W)tRl*CrMO>6NKL0x}Z zFAThkBz=0!w&_>UY{}=7Rt;?M%otni4 zNDIX2wD)tw248v-TH&4nKOJrV7+ubITCa%38$+&nYwwMVT|9FO-FT5?MTyP|?PVzay%3!@CID0!W~blH%Bwb;)?DLUhRciP78!&q zc4gQffG^kk9O{$l6QI-|XvZvjF;L&m!He9iSmb%94u2lSc)y%kyBNeI&Ul+#;q=y( zT`_GgAJ{E@8Kxf(!f{uwBBrYpXKJ+3$vr#?t*xwLjfJ=&6MumnCcgh+SnT%{z^J}A zd8H`=KaTM+dXuk?cDXgPc<(?D@L)(qc_8J`m25NQ;lqAsIjTU zQ=5#j!8W|3Jr;ftW{$E2Cl)dt~Zo& ze#Xwnx z2SesmblZe2H=N&!zxhp3=QyV;EATyweoVH5BfYMGO}6R<+Y2t~wl!rb$vhgxdVT(P zukY>{vQff{Xii?D9c#C0w3`Gu3FXxu$X1}Xmy((^PXwJ+Jj-uaD<;sXv&$`>Zt90| zO}EZU)#TUI*ERr}7A`WZNG%gQG3gw>e^~D~Vm{a#YmWwq^1MWnNR28*v^6MC+A++6 z?a^sTIunEDRjq1dl!#o7*nu@4fa@mYpY0b>7a|X-Cw@eLbqA~?y+RSyvTvj5JJ|%m z$=nFO(-<^iUcxO#WaXtP88Wqq_9f*J4g6P`Wg^uI@iQLbgpWsW4l;05aV&10E7+Ui z^KWZ%Ilv{%yhtOh?Zh{TJ36>sv=4w2vA?;HD8Sawc#E|91CX|({fodg_OgbwJGA&M z*U`Xg%`NqgJMEYL859tYlG?W>alUc^_MJ@N3zVqK?h;WIRZqITwHVC6M>`z$VARb;PgmoDKH|x3qUfz zlda~W%|D+pV>(%^Qn=BO0;Ns=Er;jar)9uS&kAW==VWQ(M4EyZG{);Ip*$Cxem9_B z@pF?av@O{;hf{_LIwS#cgz@I~8UggGWPa>4Y>n?@X_nAz0tAKdB>8X;d;oOF7xrW2 zzbUW-U(5uV1B~p@y7|eoA2W_yZmCTf6K_-IDo>F zdfhA4uj0^HAS(}wA|~atY@NPIn6*LOnS5DJekPkAWu4eTCdu45q&@fm7^cS7$2}7~ zvkc-kkx%bPtbKZF7*%)LS4+p4Q4CmdJ%l*-Z_oNox6CTDxH?=fRl#=)KdV$c&ej>Y z%}4E?&jO~=>}X@TE?ft7XHg2lRqTJq*d#H{Zf8&xNS9agT!OC$+96BRXznZR%$Ua{4sG`I#I{E{+&YtFj}i-H3S|1`WTobU0Jw3s#6!TpU5z~Y zh&1%hqd_^Zg%}1|Q&?Ai1VqO3W!>7bV`?jt(#ld#%dkiHVx=n7k-(smnDM|W_c+~3 z-rq=e^WW(xBY?=?B8|;K&n*W5`b5j;U=odO8*FTN6bFYkB~_q?XSC|+uIQ}AovzjG zdqUZKUxMuythjosOGdAuFsRkn9d=c!hTV;#D{BT5OuZ|OzE%)fJP{wE#vi8g7N27; z*^CCYrd)DpPQ5vi))@Or=>+y<0vUDOxCU>&9cr6UQ{tv4D2a|v3bi4}LX0s9MD4uo z6l{)Z_)_6gnqjS|nHA7>dbY76;c^xASZVU$6A>*KrMG9ZPtvi%!;-6k@r!7f#3*7! zyQ;o|JX{ojzA`8s>WBlxrXTfWB@TKAUKoz37~l4D+95h1?hQ(oo2Ogh4&x7;@AOHB z-Q*fJzAA?n7De*8D0TlnU3?;W=4P*LLRwv;Etk3A^n`1A=6aEFrRT!%d5Df=XhlN4 zQp*vD>h&~m)I5R4pB4DkeOlBYx`Un{>xffF1vi`6ansjsKxQ}La_)SqnXC-y41qt^ z=mjR5E_c!?Y0&9mDNZ&iEh~+yif`pYs^Wnn(LpV1rgW>gGtu)XbJD6h;H7>|2@m6Nb#hJm5Ad#oQG2(`_q*D(-FXxylP zq`vXFhr=S9BQ9W*Y;p+dswPu;WgW#BNN@L6I7S$yP2j+RuD*OWc+Ahhr0QP(b&JNU z@?F`AYbabVEM$?rVkfNd@LD2BYEX*tlz?cYZO=8~14UzhX5js>; zM;iS%RVFmKaxjh(P8O!icHJe{!q4BBw4?;}7eQPGy{yAR=(`sy(T8cR>FFB=dIQw2 z<%oScZhvWPAGO~ysU92-PFH+nW8l*_=oKY=X~iF0o;V@gK@1nc7b~-Y4|P8)GBkE? z7zwRgc(I73)Wz0TDAu!FAy&aeRW{o|EA20*g6Hl7Lw&;5Os+*t2GW%V@4-{r$eHcP z%SQdB8%yJ%3tT)pD8Okq+CE+d_5QxF~n1=H5~ z&UTOqD`LeIJMgrWHsFNOnDQmF8zW-lvQZaW1nPov-tngPeBsM9n?U#5;ATgh1j!#(VzV zQ|C@Ws#}ryi$AuRhnrF?>Mj;Y2B^A&~Zd!T=$lS z4v-ZwQWPO_wPXm%4Xf-$N8_9)Is3%hNM`&lxep(E(ze5Sz2c{mDJ&c#(SzGN=b7l4(--9HI)nv2ZAlN@{iFxj3(Rnc|i(sn8;77XIA2NY>Brb$*Y9-`ce@f5`sWm3N7VRh7 zDCerET-@*nfebQ4VEiQ`$-@>#GP zE&Tw5X%YPC5Nfye|Jy+>0R32Ye;g)8v71@t=U33*ywlxW2jh}zO9?Mm%ji0 z0K7-EDdZlm9HPS%&TE<`%rtABTffkJ1Gcv?g6nYeo_F<3GcJ?_Ty!$2(ZY%g#jg8% zZUjrQQ&$P052LgUrN%70Kqe4OA9YG>+WEPKN z4no*5si~x){>Wye`a38YnCorGyr0zKNq8e8pDqo^f#HLf-kQwpS^;-KH1Cgr~H zn<+{E8r|qhd)JrG_9^RYg%#)K;LWo^9*3@v#O^PhP3ej=9d!4g1QnV)9eB18E}KU& zh~l`6v)YHnts08v8vKg!eWPMz>U(8v?SzA-^b~D{KWfU{=GoeNhd!Z8_^A2KCfF@U z8=Mv}^OeAcsz8?sM-*TG+hK2dZ*UFyX1wJQ`?Pv_d9f>=nqhxVxi@BRa1XPC%J3n9 zww&I~uHBP~$v}lb&X2kCWH<7NzCbTv=xd#1K2nF9uGnW@*$wjT6q5z*!E1Tg&dB69 ztf+AN-%Q>WExt{1z8)EYXDBWco=c&}@`vs;E0=v{-W6qACMb9J7eVn4K;z9t%H6yE zF0fqaT@W=+MTY7#Nr?pFP0k`jPy`51j?Pf?UydulujoF{W_9nJYRb}gl#zY4+&J28z>v7GJ z*<>@M$VuF{yIO-m93$leM}b5O9<^U{?riOqd^Ou6sZ`(cUDUdB=}SjTrYg0H%gTKl zLf(?R9?!kyxkLU%Wzk?UOu@u5m1ib}=T6$uKEKxe{5pb*%Zbqan5*>CWEnRo_Evuw zvFjg>N^x{vKF`Lxheu&zIvt*n9rn%%BAM@=eiJQ=b@~@A?F#Yh8rqa<_Oratb`&G2 zEl<*UDM($!&lfJoIFjW9{ez|7OKw>!-@;;lGh%GHfk&uOu(3Qud?J_;2ypw-EoQ|DIHP^}jy!w=+njQz zI2BzL&?px~+s)m5kwYwqI*mb`dW0(1P)-cJh^$Vn05su&O=%&U{|dX;dK3OdFzL{< zf?%M0#l#jZXCQlh-OH~#s@o43v5oGOMURtiZ?4zkGO-)%*6YYdC==Ao6T9QlIkwX7J%P zqHOAOr;ejwS-klCy!d@|GWV$U z$h>9rWj+xpvkC>i6c9X22f?;ffGIM%X9q%pxNG01HiVm6Z+z)V*}iF-(s815DXL?iuWBU3#XuS4K<# zZ1ldm$D%;h(%+q7XK|{sc}+p9SUCm>zmL-&OKl==tYf!JA4DfTG%(y#el<6kod?C&Az;(@YXn!gNJZ{b^=#nKY6 zHglFQl!^}0w(Z$cCPw$SQNhBlYeX)(*e&zQJ}{G)CjqKbn%IFnBM z!yb{D>OBi2eba9swttafK66>F^_uq9OhWv>8v#y9dWR_kYbICYq9)u5aC~p4UPkTr z{f)IXnH=-)6g=PEJZ!?4)J-tPJAXZBbKD%TgcXMYQ0{>tDNEFxxzz)bs@JT2jMwN8Ge1LB%v(lXw?Ys`1;$!ieJh z?626ac2Tb(v>RhBxJ0IQ*)agsZRa~JK2f)U$C#2Zi;7lFF7@4tD8+^1BGd21wqpXw zmjlNp$Off4V>Ditnw{@r-G6-CgUW8){QYR!#E6r5$G4p6_8M*0E52~e0SJPA6Nvy3 zosVmPcSst+7(3~UoHJsLELV~*txW#K_7gUK4({f48mBQGV~>#6ApY}KOmwe28*nAj z%eI@09}aD5?{Nyh{u!1~q+0ljgE8;I=?ieCnk&E3iGDwl!&^Fu(FkEyhG0Of9^gN6 zvHoz|`((KrqBgu+2~tjn%;~?XQ?0>@O6=HqY1PTE(5Rr-^^$ z7k7XxOC8R`m0yc(tC@M+T@%Ls&ezAWiWFs~bNE_NzsAZ~TPdtt1+`N*bEX|3irzOo`l~}I|ij`sBG@p9HdosO#KO9KZn5WMW7ZwYAp^swv z08|@=-34ESJD)O|nh`0qA78IHa&iy4mvkY9yY zn0jMbB9n<4qNO==GE99W6Jf2CGSPM97id?8|__0!v!bvJ1V^ zC&T&xwA&ZV_)o37lM>iP)nT=y#wGI8adNv4Z-tya*5z;Ka&3T_&`8`+0+M}>7rjLT?=VTAPGMc&_6x!~7j`f(}+ynW%?UvsNpvxlh7}gn6 zIiOW_pzDu(ik0zLtLE4yz6wh-Nb_lGl2IOX1&4CSvDyY5zmBnIG6%DIir7plvsO|( zLe*0B6xRzax}ft~6cmq@TR6HKC^nbxD*U*;aXV`w@HFUAt)QADQ}@VDUdG<|{w>Z& zwdIT|EP(@KJDbTi-CdA~xr*M&WUXYz|F(-NkN!cU`o7iQBcu+>kV=y5Pu z@&jPDs?ndWmtAUMP%oY{*L-m-PpGr(>5~@Ib=$P$aq(>(XB?cFgWO?sRH0TOQN()g zFm3~+0FQq$c9H2>cThjpp@S#3xl*QMPF}jtF5_-K7o( zt7q!MQnH#9Yj|e1F2c>#b!v?ax)!RzO_W7ShVE#qTL;~E5@Kaxs{eA~vGWggml{6!Cz6-*Z%+R}*fA*Uj-6Zgx zd%lMne`~=I&bmpYxQXkb{Pbv!HImhQOImCtze%OXlAo11d5%o05Uu8(i+_EJ)eaE}Y*`=QlS(ajSV2 zb0@CpS1tLc(#!Xw!(9HJaW%KL_7K&EPfNNmmXeJFx$|9888{>w=Q=|!(fg12;&_PO zm_~;JE6QewMCK@tsb>wZ*e!>JcnP%b0XJZBr<-2usi4RHP!806(~U(lGe>$&8Sqke zYpq8VtAJA@ldF&$KFxx>S=DAHL-i#4)ag{R?K_kd1Y}ngw@_L$=>8zWDCfu;Os^Sj zLpEn^a^1dMXSKY1V=D+`%3;*d{iUyi749H_EE5aM6yze^u3hVyD*l3fG8Lv^{G_t# ztEx7jstptnINoMi3$j`T8(w=5u65H5Np_|PTJu;QadHye^m~b2?`+F0Ye=VYP#!E8 zy3jj03!p0l0s6a4WxdeM8a&Vpq8><_I&eY3J)6D3aNuzQJ{vtru%xX@3GDui#4}_5 zeua6j&G_Is1B02F}UEfSuQc_J6XUD5-I1*K|{4^%*68n_&&s!frKQ%6)izuGA z9Kt9`YD+4DiO)B6fCNZK7)8x+K4#RKYMdk!gl(*S--m~T+B}A_9H`*>l=0}}97F4N zA5hH!=_#5p^5SN5>f>%w5Rm6}wVz#DnOd`=QOx=jV5`A2vbFqvF^wt%S-#0+gK*RR z)o}+cenV3LGILSsF2J*$x^#@Voy0YVCTVTl6&>+rfdl_58JS>%vg!xD(TvNNC*2)Fh+?p$r_6`Y3TjLkkbW)76?u#1|pAi>l!LkP*BW5HGQTaJ+Oy&7ab zIWlU-`Wf-nzUgZ{A2e(-UkF`~R73cUTN`?hz=scq*4O zFaAdgO~xMTgkg3>1DP^e)(OFBN6_x1;1ab1tz{!`$Z^pg5}0!6n3s zu&L(94U)Ro13j}kFPar6qne#;dx~PC&C<@0)gop9?~(1M!4x|ZY54_@ZKXyw9|@WR z{B(Z%MoAM+eXa^GFyr=yX}&F`Lh-z9K{P1+H*}rB9{Jg0%AnI0=6l}vxFj83Cj+{X z?cfl6$AGF{Bl&#)_<;NKUB}Mthy=4SQ9pTPs*)}C+89&qN@lnoU=BmG?@tcB=9xNE zo@(v+mukUfezoQ#l;s*;HjW3c?hJ_)FAZFx4j+vslDBw|4Z+~IWMo#dM?C^5AGO;j z!`vvz@E2+CEX2TTttklczz7oX$^cMERl15BIsSf(c(JXNo3KIQaY7>fKy9u5}R?!z91 zynhbdNkPHvyha0!z3?tL5uMk-mN@w+W(K6n>aM(XRkUu8mXa*s zQA<)i_Mk+Jv5S#&>Q2xFzm?7-%{+AMFOb*->~R@g;ZR+MJ4N$xg`D>#uG8AXGsyEe zdx}YrJD84fuyB$7iPrxBcj&QR zG5-L~Z~p+w(9dUmr`g_!e5xed{Bb>^U95f+h%?#AFYND0{{Zn4e_U7;hWrJ;s`_I# z#eehUw{nlsAL$wB6L(V5{{Z%nn$*IIm61`oihZNRU!Xn4DVC(7eA`Xb!BbH0C{k6O ziRbH!;Z;g1GFqB`?KBLZG05W-lTjr_G*c8_V`8$e<-r&;f=cZ68-f+{4Q)Ks60%0$ z_OgK#goY^p01De~9c!zrCd=ul^K82=QR6iZu1rIi4%P~y#D`Qgi}v-&5AbaO@d3) zIek@KbxKpyJjZA|QE&Ca&TE#|QY!n!9Q45aJL4c?#8G8=c1x7|wGA>;#-Dk6wZ3P$ z!%I3Dj&Yh(<&n4y!#@Uh1Fci|mK~zz2}~sS7bri1KQj4R~YYO6P>U;gH!3_Mxi zfS~-oXA)y$p5POWYo2noHYl>1oX;>?YE<7NetuE&HXX3%Y_lWMe{Y;hnXPuxecdc$ zKn2e0@<_fOmGdq|md{U;Mv+K}+ox*@CSZqvN2kSM^ITUd`pNS=;t1YUk>#*mt=uvB z+ACV4ah=jjd7V&x4BZkxzZaC3I-uT9)w!ldXG#)nUu9N zRZ7gwGLglA9fimFoJZNpJvAzr;@fe(cJ^Lu zdwQEH)=VGjm_n=ZeL6lq0|gn729W+ZEo9F0OqvIEX_DZ ziC6IRxLd#H^urpZYH8Kow`^AXxUokJax%*|ti)<*rZ2t1nd8kVildo#Za{pk{V<^f z@fg(=nU%O^-EY_F#~6dDvvyl8nEvxOE&f<_)9NQ$RaQk?@Y}nn#3?Bp-H{qxdO1Df zr86vMpK2=IR1b^O1Rl!G6fUTC-^=yyhJtD~Wrie;VnO|IrA=QPj6+DO65gcX}Re zi6b>-{hr}d%-rs7)&tV`jO!I*%+jJJZJUn$t?>+5DQxJ=3dnKSJ}Rcn)2RC==3Sag z9a6L};I|$|=lPsSG*ZJ=O9~OZmpj|kx62VmUrq}oi8YY(_5E=8rkXgRRcAvs@3U2F zAJ+pWh+e^3aLSn;&mPJ|)7jI|R7}AxoAv)v{#ytrKOHK168d zl{W^D%h)KmZf-#rxEO|V*@2_Fw#a$hybE`?9=JC+i@`^jcxcPzZNL=+&<{_Z08ImA zCq;dRcL>0`(2X~*ps34GL9o^o616E?EP=bK6WxLI@7#Ce3R=fPXx^jfDQRjcmMWQ` zCMv~M@ov@x5=E|duRkRir5ayV{?B0xN}x$7_`K?yg|B1l*!fNG&McOk)^P=x*0ZC= z_E~oA1PhYrMZsmeZnf^VHuN>gB9fi=YMCu0HIeMI@2Ook&NMc-uFCT&DPfIY>>Z;a zWJ}mGo&g5jAIlKET^S5+ynZZgwq=oNZm8(h%Cp*ND&s^ZCur|ABd{K2JY7$g_Tcf` z8Rymhg=alK%qgkjSThW^cXLZT3U1_|g^weEFK#Wm*t=oaqa?E*pQlW+Tc*E-jYr(PI+Ra-Cum_o&?u>NiTX zj*QPWwm{iFU8*RJZcy(sv6?YrZmMpk&Zfi;8xc$>%TTNbZ@Rd7YK?QOb$(xxQR6MZOa#35j9+;p{ThFL;VT1wKy5BHrc_E0kOG+u?#<1Vl1U$2Ns{h@OLi;Gm_ciC2+O;v z(@j_BIo@?uq%+LHr^%v;zTPJBCtDi>e)swjh_0#_X|o9^;EGj-4D-TSS*{&GZM;}m zkCrV?p3!+uh4z42^{;B2(z+M%=-GI1TaBMlY)5@>sK}dFWMfal^z_wPk(#PM462EC z*xLT5&3sYmsv|XAwhsvx`1M=8EN?Qg&))w4OX!*cJ0AG$Q_X`Lepu-gdg5_*t8oKF z(aDql0Jm)Tck{3G!>4G&cPU@~-!tFuFZ9E!Y2EPgho?R-fKcg&;h$6YUn-FseODEe zP@^uWtR;KS-`5tGZ`tCsX9%%CJ2LR(%JW*}fV4 zzrz#q%Q1{Z(Kf)p7At>6^US{{$a9!$tD>Vo;zjXV*qhs^dSCWhG0job{99KPY+f0k zSn}4Bs*i-Zp2*F0OPhX}=~Q5*U7Ap4)V@AnQk5|e!q{0z&*8;s!R#bBSgS4c(EuYR z;O)mkFE_)3f-(Lq39$bFdl8G5Zi#qaVUHdUE&lco?E2&FpIkOvx(aM&6x*oS1;u*T zSwpiKLh>J3t}YgdOD5pyD1;N zgY#zflS09yZgD&6eu>a&?_?b@)WNOts{GeD%%!G%IRgV#O&VYA8=Lxa2o~HdPAj~M z0}+Ds^TAR}+pV-&Npu?Y_M)#XbV{X)>dW7O-}vJ@>M4vBl0sVL zSdT6sVHmVnq#2k9BYUYh-UlWXC^zuCWM0P|tb2zoj`pZui_MOCJYvF1sMs#7v9}zy z961iE)Ea9zOv6v-6`3V^DGO0SP|(N$;MtUegd_0&9CA(Y!`RtISBr%FZ!9-zGgVVH zWpuR@$Yq{JFC)8LyBB+ZpS2f z3?wh9;t!dvcFEn7=zPw*IH9D57G|pc$@`7iw;edpInJ7=@pCQI@&+N3cMLr+ozgnt zNt$JIR?w`=Pb$cXD%d)LEuSS3SAM@gW z@Q3xrcrmi$M|!^+{{Z$q>K|6{m+t*>obD|6+xR%%jsCx)#rVhn04_gI)o6#aVwU!G zr6IiD^(g*$uzNx>jkvG=%@;n-aQ!Nz{(^2I!yv2v)Jl`98F5COHlj-+ll`GrkQ;nS)gXlDhisZ+>OoM z6mensoI?H@k4!sye=T)yRkD1G$7Rc_s}?!n`=lQK0Fk$@8m7ib@*g%#C<>wi5^~%>Dr0W%}r{c z`<@^?es;bexh6rD>Fk&Gep3R|Q|{j0YnN}CJ;}yvC2T?$Ha*JGF$(ci(QT23xi}AJ z?%M{Lf8IY928u9Ow&RM)9aVI>Q=Ym}GxZ{!hpjmNSXk(V43Op-z0%i-cXs*QVe!=M zJNrYaIdw$P__S$GJ>zc$R{Yrf?ajY*;#lcNN@}61t<0m1t7)m&M(CEi$MLVs`I6;N zuHVlZTx~MpEsSnQ>Z!EvO}{?)j4HZgSamei)X=ZG$v=k%?)yP`J%1$!72|_cgQ(qT z%*JV*e5F^cw@udOek#+h>5|?>Tb}0k`io!k!tA;|>1kr8mL_VZU|mX`$;WO#J0F)A zx%ywF)HzmtElb1x&$i6JjFsp4lh5yAaP;pls??Qrm1}j8SgN=FBNbwA@)ouZ)A0M9 z9o@POHxNc7vrd6h-80h+*E!54nphlAM=LJvw%$iJ9kF34x?>Y*8EKW0DVmIU3bEZ> z_B@`)vBiL<$tb9@7^vZmLMvZ(-!=K?^T7V=8q=g`o=DUL`dCd!O zLyzGcs-?G2DPhy?Pgzg0x!^Ij<-XM*0!6)5?m_hr&MK8(Po|~URWy5AouHL{$&o?d z3m=Gs>E7eh)Zr8NP*}tIQ&(iWEojcR!}#>)ZalaBNdTY%Q`( zJViSTvzy&!hQ8AVJwW-yv~MfswFXs1_+s*c>tSLDCj8st7>Vn&!+4(WQB2N?o1%4V z7E|hfBeWc9mVMINTIgmT3Or7rN}jU;+UK>vxF63EzJ1W@DXG;d(|A@p8Dr&9t^C2- ze_C0m9`2HnbiZOA{;_=EK>ip;Y8Nm5dY_U=1X zV;dNDUe`T?0e@8PLJeHGp zA9r`IF7|7bzq`{4ng)%hLRDTd*q=gs8}7gI!$UFAdUC!&?-_EVvV2i_PitP^o)*kP z!qNmjr-nqQJu~d8l4etmJf_R=;NR_ugeqO^douRK>tE6As-i;KWn0rsRYLBJ$hU3) zxaa!fJIy*A|tVCREZ(ZFTci$*_!aj`kUcmZ_R`6o|GX{9CZ4 z2B21MUA)RSKj-qo9d?<_sA`%DxFx5QTgvg+bM?b^YH6cmV#{m)04z@tQ^~TfKM}l-R{vT5`(Nt(8?hJ!I4~J-oJy&D~Epc2c7uNeJ^6`>p<1ZOKgYsFpPQMd#@)s8-A{J~5Ho4ZRbq_K+~70#-}$ySZE{#)77v5O-NQZ!Y3& zKAxCoLSyl^jmhTnvh#-}HB8j>YaDImEpM%eZ4^`O5j9sg2>Xc_x5Le^#~d61nwZ1lW~yt;Dw}7E6$N$Q zq6bE1(N^U#EmlumERxf*DZD5J%CIAY$lxF0z{Nn!a@U4uM~$O(;Hxc)+tA}}hG&vz znRRAGol_*x)u2{XjBY^3hVRK+dA&Th;}i$3eG1LAE~B2h3R!aulCoEtmaZl;uY@hj z5IAd|RPqPUz7Jveo$SdDs}kZq8}XSV7CpaZNF=9WC5qvDD#<05sv|5+vA5pz!?`rI zMOOJ^i*l{L9{0qFljQ9NTN=)v@cQDxRfsjLvrejwh4B26R9-=ABKbuVQqh1K-d~3c zR&A;X{{Ytqyah#22HWH2PbjwRQ=KMrb+bbViZH;FN&>u(HVMd{rFP*}(Mwz|+u)?O zD#Ho|bcBf_a=_s#X#OlXB}+BH-RXq6lbd{4n8zlZI;7~MAYp4l&}Oae1evBx$SZQX zA9_z8vjuKP>Mw#($ME6H)5BbP>6y}HvTdxX$z2m|ulaMwJ+V4R+6VeCF<}52_FuZ6 z^Ehht?@8OJ^4B&=UqKT_%LeO!r@E2N$;3HZQ<>&@Ee2zlRLNNb=E#)uw`cN_-TA-I z7H_0_dYXQk=K51mLp?oXN+h0wTd9pl0RC70IEcEdl0~L<##5Wuo)go(bXKn5qXCe`-7TKV*|%1oCFd6*Mm=h@;``yy3}~<@FU= zvt={O?t!-LcI*ZQ%FgWj!yc$gwjH909d7>s7yWwR)8z1m*$=^R_SDmJ1GT^S7gR}{ zXdP`W6cy_7MPjq8myTs`TVmbm%Kre{8a|IOVX>u8GOx^c#21!ypZ#X(o96V{lSN(_ zqN`l?`Ql;ewpp2FeKUtH&16|>AeEIFKM&U##x*4@(B@&g+H6&orLi7YP@W<`FT;+2 z^H_`-F_G~3vG9!gt+7D5a_AKwyN`S_TKF&!e6S*@9+*KZp%IcB_V{p%m{6qj>gqMJSmPXH%h*WxN40y3p|RQ@42xEX3!d67sK*DWyQhNG$H8U$=z{UH7;E$ z<_-#RyW;#f(=d9n=2^uBu8T7XZt4TfqOFccGE2L6`QfuPEwD;FQ@k)bwv7J0{SVhTdA1Tz7^}sQXCi_)h3ol|nh9XHT zUlGV|iPJ%rrM$u6zN+{1CrxQxb*|=3Z&l!BRPgvPP$fW%a{=FuY&^fN8vR<*+FK*) zc4d%c^^)dUT+tVSAI#7<;N9zQo)}4|YI7=DT}_~~xF$x5&q``G%^5xa09*QCEkE%l%ehtXWBD+XdvfvgMR<{?zhRYs13H4h<_GR3CoL2q4@&4{C zFmE<1=d&k1&L9u|{czZ@t>yi3Ld8e@!cYGIqKHwS>6z#d450b3$Omt2*c9KD{{W+c z(>WCHx8Vv--^gG?MrT+lWQ2jKHI|yuxjNTs9L_AhHvY;!@<@J4qmzvL>Yl!$*8NhO zHOiw`L%XMY@z~htg99FJ~>zcXaO(&bpyK0j~J6x8x+$Z{C%PKswZAE8u z_f>huM^i;5Eain<>FSwP5PMN@RJFb$aN)_a*{f?7IG|}<+iunQ`e0Zz?PPP)OI1fA zQ^=u_xwEM@zAa}k;?Uyixkkk;GM1v%0Hp)`HLR-pGAhtQzf=ZnxT;km0fc_ zja6rw%T3OaIm>GqV5pWm4Eq(cl!2>bhaHskr@*=nVDc5c6It&LWajj+TU*-~e!%<@~+bo0Ya zm!%XOLZ1)r^Lr1F!UVL?Nha?Jf8D{>M?CG_jy9YY%G)8K_Smj}!)$qLw-^{GJ^N$g zw(KzA8YWAS1#Z{Jmr&kgf!R*ndLboyZpXzY{n17qtIhyu!!_jcwiHZ7d+~r;EAzV? z)ptakV;>Kp!FQvC$-RQM6pTt+ljguOCzScN+X%a?oCez_m1advJkmdew{P9~Vl&iw zGLB|xecf6>*V^5$=ughxn49+5a6)P|otQfLKl5P+%}R=CV>fBCp<2_V@KxvYXB9Kb zimC%EHE1%AW$nx>cr$Zi79c=UAj znl1CXR%xW8aFU|8*~pjjvJ!3P3j7}2VV7N#S5nm0K`N?COs?CJel$`EZ;-Gpdt*cN z*G|7<<+bz`F)YwjSb5Yo`x4>pZW`?TcD=2Jrf1UHNPH=#r+UcUJ>IppjoTG$rsulb z*T1hK;}IQ(u(w5Vr{gova65Ea_gR#Q=;|h^qgsl1Tn3I+_!+x5Jb%pg#BrQxy**i6 zlL&p$%9dq|v9az4ZZUWB9+lP7Hg8T@rSVjVrfY>{lXk}-_p<@{enS<*Gt+ex_3Il^ zv{Jf=;CEBC-Bhyy`gZ#MSP=MThQ*|-lsJ_JA`4^z%C~0SE~p!(qh+X%c?!zh+vZ1n zHYCwiv{Kx}>D;fE;7et1~Q>SC5h+Zx?`?Y*vkd>$~)mSIm$`y0wW@6+pmsViAst-E+@s`of)(Psw1 zOp3df@Cue=o*8_Jzr@?{t9)1V!q!hx*>!i0lCluHw@SVwcUIg%9nGzX&n~N#qyWqJ z?#}INf9Z!Tk_k4nZDo!k+tsbKUdPw#+XEjJyeiui;#TKZ7f9>4wMLH+R@5vtL3UI4 zSB_agBFAvCR~9z>LyP?8yoWTU&2;5Pn$=N7SCrQuvXQJ}0Qpn^exmm$%6s<*8TqI4 zHl)lU@bekzw|sjP`Pdun9NV|k>&7R{k6TNfQpH79togGwk*XO$doTq+>{`|rVcXXg zikf2+^D|^&ysDV8JK(GipXu*O`c0+vt7}a>+4@(~vgFnCCyKC=J1@zBD`Vfw`QnM! z!%n%B-s&5`-gYy0wfMd-ww=`(R&$iiqcw_0Sw$f}?@-D~M%V|I z@%nu5MnydB_^?5Rd_qlh_3eBTk}>fp{`M7_F1+)Cj~NSdi9n`ENRlPhhTJF3AFtiQ z+_9fEu$w$&U4Ad##FiAw^Da%P$)U&M{Le@srO4RkUz9SAGS zI5{G|J9k$zQ~uk_H5PBH@`{*|Hpficel@>qj@HCE)R=24sWi5s%;s0jsKf^rXuwVob_Pw3?&GZXFi)QhvCFb>$^p1ujjO*3>NZFy@;bSCxg7 z5w%Z#-SMAL_$Ljx%q~3bW#~FbW~gs#kGdlr4q;tcO+}W(l2%UEP3>htYm$E~ELCKg zu2Qg!&_%t}?Pwb6*8K72UprCeQPd~Ksz>p`+{ZDVzGM=734N>i;(OmWJOW->I3({61Ab%N7eq z>soAwN6nViBQqbj^?OyOkIs*=$2AAH|BV3a|Rjs1J4b z_8-p{*0P~0bE=xC(_ofT+kZ2PqXy6Qqfw(ZzuQ><06bVQ*B3Fz$SQXhhZ=ZGyPvW< zk>wSY8MN8bLu{&nN>oqig#7-PeMYMCDUFsyYjQhthOSecRY8#FntB?Ilo^kfp*Hs) zo+YgxpecXs`f2k_+ImW8;@eKqt(c!n6Y|8Wnub8qWIl*q0fGD`QZ%c#c3{(sKwF@a526lJ@k>h-pZ*BIa%f=Hva&3 z2pPstD$=qh)noBpadB&OszpY}!TY~=5MHRsrHZ-8P0Rh<9HYfWM4EI%Dkvj-MYi2l z`s}gbs&IW9?%;~k?i}vECEUX)M^}(Vc}@^%at7S~I(cz*S4JnyDP0G82W~C`@ z91x=f+xxhvV>r`ZGBH|kyd|_E?l&njFUe8`0HTY2?j3ZLimT4vFsPKt*#7|Kz{?$p zvg0t8pvYC2lvl&%*!RM=4282?`eV(%EJM2DE#cb!Yy?0jj2ySEumN9RyN5w5>nPi* z3x0;`Abt}{*v$HoX2za%CNSL-)IUl${+P^4uzW@O<7?p4_zxa`qRDu@zmFO6S_|yJ zUTmt$Y6fmMlSa49pu9li7-@BhcE|3+-ggSnb{O0~R~SP~0;A0KI%vab_QH zlhsI~v8HFDGQ#W6Z|8z?C^531To2+d-aDLebqn!%kK({U9Mvhng%Rq0k!bx@T`f*y zl`M6S@l;c>jhOvy!TuO!!R*_i(zATh*3?D#8lVCBa4(A;S0boKzVVWv2yhSP;kMe#iHC#nY*bHSW7X!&@}T z;jD(z4%lJDJXoUCwX)N?;H<9d7KWECZOKlIg-mbZHwsIZBwvzkwE6+tzZih?3Tf!; zr470@A90kEYj8>b0CyVSs=9eem}&WAN@RM3Q{jFl=kZwa^Tj~deIBomGH0ZP=9I)k zZ~H~uJC)i800!jSmhFL4)AefCa9$y6m?My?n+07+hHrKO!M8IDU+44Z4y@l#OOsZ6ja&^KNFF1_;s#~E9PK=PJv`qoaMYGbLj{}xW; zxi>#AOZUKI5sa-qI>_gbLZiIqGY)Lvj|;@}Gj8K`yIf(pH0WDwz1QJoYjKGiKB9{; z$zN=nCl)LH@0d5Y7>nWq-i$RU#n<<5xP35gox#kx-B2+$J{hbwDMmC|veZ*2khS+< zDAU8O8%l@dtKc&zFrpo!ZT7QwU(@A)A(}}l9JJnFyS01a;L?SO8FAe?Xno;i^CMW; z{5So5Fzlv+XtMEJ)sj2F#U`k`c)K08c9iwR~ z!_EN#Z|j6S$VSWJt1A+>__=%k073a-7Nam^tfy$=c7`~-G)9v9HuK2*C;pBbWL(j* z?M(j9CWTuqE3P4taww~0J}FQdR${W$n;Tik79N~_AZ>m{wV-^vshuvb)48$#0BwmI z!VkvA0^@bNAJ>pC^2STWoYYI1B-F8cg+}rgDt*h`@&|HBA6{{GdPl6$cc;IxVYo3`9HYqiduqFRMDzATa7$QR@K3`5!0x6X5!ogja6rQCL^aBcNC zu~SgbG1|dWF)k#-s2P0Ok725tDrzZWK6#Npyu%4nS7rT;WMA(LSC?9eS()Z%Z{A~q zv&B-e-6e1Ljt(~oXIH8txbR;{{;JLb4>&WWUU<5_naxci!tIk7cWt?|@NJ0p6`6eA z{{T5t_@urDr>d&U^GB|ytd%MmJT`W>nL)tk#7u5zJF4~{gilFQ*(9}xWpjFOuH?|U zOVLRmzauCfRs(4mj{1k6Q)b$)Ev$~8-5yH+02Tb#-FxB+q|Y@aMN3AxryV z%_r0|d%M@>FDgXWi)w+i{+I_A7TD)9k}g)84PzSM_O$3n(NFPaP&U#Z28DG$d*2ns zYxNLcv#VkUK4lp2=en9S{{Y_CkNzGdoIA6Ezc-3tV|8KqDV~y|H0nlWChsdE{{T!o zg>)^(>*BD(p691DdaoT!uC{M49AM(=jY;BI%8R$+`#d`QJ?7ekhUX7mIDTC#A>Se z{xJ?G8ygrt5`M`-i!Pdc+2xL<;ch+!#N(4{s;svuN@}`huZdIz@m0V2Vi(GDT+b-Y zW2=EtO8zCd#Ebs`Y&wn#4+!O%YuknY0B7eBYay0nV9?>~WD15@VrecUA4Kkgy1!G_ z8eF3#WHMYcrsdo9^u>eGS~5K?r$>)3yjRMg%I(hIrSVv@-n!?s(TLM3qJ{SNSZ%ut zuyyBBJydA)6s;RD4dwJWr`J(p633B^0lvGdEEN=?`N_HTR=ls6-ydx_3W{S@lhRba z)p=r9ZNE``8QO83JHqQLI6f81jCHi*;J-X~WBhP}S5SL@o;nIWIlz`4zZN~Uu#2yk z8$V2Qu;5&FtLEnky5T{1VXu#T5$L_}XK4$MKpwuIcN`~Fl2T1wFnUrgxST@zqfeTa zl&X1;JFz}86L43)5i4@Usf3NHP6*Of8h6|jtAaID{;y6+9EWN%k%F-4x{8{FK@XRA zo60e0XVS?ej7(qf;A%Z93|71<2lsJq{&WKqT$uM&uA@jYQJW_}hXkqgq_ao_(Ctoh7(yzpJB~6tF5DOj z11<4el2=G|DI~8p4@`Tr&3p@M^N)xF3|S!n$?9+$04;0|-wnQa;@~a)FqEsJAkd{{X>1^u}M;d_atAUT>9C=K6NCEUR17RK#O_ zzaxt4S?tlLrraaUsuXVW?zeB@jVFe&id;H3vQulDsy;u3RALTmqa#46K3SjVSw8j3 z^IELDKP<3JP!sxLaXN#oqvdrzWBw|p{{WsX8~ZP1dzhwn>c8EmUr02Fw= zza7BjH*p^&OKt&-Ml93yRjE3iuETMu>;C}#F~P*@zfcwKH9cc5?@5aaeV3@hv0V9? zzx*BxpJoB~bL)Tjyd(Ly4<3W$zBoQKHh0xQvGsGPDAyX2p|ALx3Q_f!sHw=*bN>J@ z`C?r@%uGLPLjORIQ%^l!;B zaQtn({%J2R>h`>v!}gB$JZSaYgZj(94zi!^|3+;*rOl(TWq z2fsLeotSM??Gr&vxwX{#%t%tlO!|1aE=n^xfMu4Y$z_(zydNnRAD^$!6MN296o&V< z2BeSugh1nC4tB4?57PIEyB9O-fqbjVx?LXeY z?=)dV}!1NxIjK@kEDb$@s1zix}13&1f%p5oU1+%iUqcd$teo+NzXI%sdXOIr&s5%^bgUj^iVuP)nv zy@;f0oCP&!r?R!h{I=TIjWrIDOwOU?2(puJvX!i>{48-WRK}&4mj3__63hZ=HXktk z+;Z2@r-e6U2w%xV4`SOYZEd?{cIj`w|70%twCTJXczp zK^+@4YpX=jS|(OE>~F^%ytnz{6MPT4)g3DjOpSs zuIxx!CW=ad?!ThW`LOMZzmJ&%@sn4^Q4m^0|kV6Ls+2W?0}Qs#gw4Ek-2X zX*N!Z(c#jo7?nc5!@K^E{IJicCHzydq;{~}+>Sr=^~0*UQKXSP&g}mH7k%G9(+Lw( zgpi9eq?ZeTu;><u?Dlr#P^kG1b4bv+8OZkM^2jBFyg< zKt^+WUgv~2BK#3$=bS)I8o;*Ru_?IOxcQXxbAH&9bX5&Rx#ctz!di-&qH~9}=TU=s_Yno=O z)2kr!crAafDztVJw3NpYGDqQ(v73wi@Ag&SF{5)bx{fdmae)|5y@w5CMe_Hu-G&;; zQ{hxGl~~*1P`J|LaV!CO5!swdI3hQ)qceW)IA!x}W!l@V=EKjXy7ny(*Nr`^>NNBk zj+-o~@tZEH;yJh=bIpjo#|NBuuQgI@-neQlTr!$`hAhsg&a_mk_Hf(*Vf-$BX83Hr zPIf}y4X=Mb)=Chx#hW*Z`+0X!vS#^$#-LTd``9$O_Gz_2sbZt?VLfOh+O~DTp5-O2 z<-ts_Ur?eSh-s{=Wvytt2+pKD*e@cYr86jc={>*a5Wu@b5Zc;PNumR{O6d&L7!tK*CEKS7)CC z1GWfn+w(ZE+rF3?2p+e^8hmoPVQj#91!ra*PZ-c4X<%Axww?qm=@JB1Zsx++AA&K$ zo8!DyoJ*Z@hyi8L9~L^tgW(wW2qw#fuI=TvKDU{qN<3-6t{!!aKRZii2(O-_ZGS=ok9qgp`}=xeIK2VUKb45<=iB z>wK~HKF8SV?a*X=#sYKZ&LD+*l=tj_Q%BssK-G_x+$>Z;UAes-}rEEVtyQb zw3G2+MctRh7ARFzeKF`$tpH9*?Gah*Bz)h(^qc zKqY-_dwjo^AP$%0wDq|xDxx4nyV(-gYXElw39$K&57V|S3<=;uk*VAlhWd}LH(Uad zutA)4SuQhFW|JZ4icL_#u6Hl5<%B6}gG|iN0N1L0L%Szx3tW#6I!HCsWmHBHpZvne6$iGRe`{+KIKlV;JmV zS+GZOnQ0nYiZmY+(X$fHfO2Wu)8Jw7;C$4EHs)rkQ!1`(yMvmvx39ULaF<*$`zPXo(yS%%8So_{~w(o#`?_-Ay_gxVs{{R)j;8>*HFuog- zW*%EBd9XD-a+U$#91}L{hBIXJjHr*Cc_OPW5u&bAwhy}oR&e`miQ(X=g_@wH8(D@5 zI3=)tZ#L6{&Mc}%J|!pwQ*Ha;tdX&6j2~~00Wkv%kUFn`H_;Ir&jjPCNDH@Z@!XE0 z;9wHT>*m8(17y1!>VRo&z}tk{sR@tb?S&!%k7#Ts)fnT0pNO^^aq3d+5+jF_P8%Nx zLd*&B`EWOl8EXaS9?0?dM*g^D9?PcawDl^Cs^1UqVY8UaN|f&7X_J$=zVGFQ$thr+ zkBc)S4~NTyip+|dt~L);*6+2uW2C()q%~7MwP;F>Sk)DD6{>1gLM#$Bmv3{;z`iKP zeWj`>x60J(Nl{G68&kL6Cxdf)^W{G;>5XvD^lWCG){&JaKMO2-wwvDeCdU=isC^-; z%;*C~k0ZMSvL&|S4{|pPk$Zfo%=EoHl2$^rbn?q~-l8^|MF(!)S)1123ttfW&@rt0 zNbbXiMz}kN9lPPs;|o=&!xky-yHv@BgUhh4>*7h$)WVO&JN7AGhq+sKu)s?~r@E+N z@cDjc3-r{&6(p~m@wtBJ#2KgNGRo0~VP3~5ld|fq5%*LFW_ZXRZtHKL7)z-L@X5NJ zTsjfCn2Ry{!}9v!dV4g%jCMokW({q}>wFWahAE-EZp0ruD|2gqmLaj$7FH^jXSoTm zB9+*uiMI9%hE8qRSbn&hdR0(p^N3>+q}0tQH4?OD=zyL>0!p_%$Kk|7?yUZBTW;az zX0UI_`eEy)A@@w;Cx%UnA=>Zou>fusK9(P*8mu|tAw3bio{#eb;L7ipZ4MYzv<~Q;x{5R(nswO$l&|M=NbZumfCdB@sL0N@yiWPzd-!s^M zcK9XWE6rx|xWl6=T)LAtma@7RnfF~6ZNlIj-e@bU1oX820uCFnKg${mB(cZ`#d(Ho z9Ef?L-Ye{p;iXce{{Y#+h_dIBWk~liI9SUvnu@knkI%c|RbFm!Dp&NUS!ta+O`hi( zdcQ8qq}o!VqLrgp4cf%~{V@`1$fEFA+pYa^ z4r&UQ#NYxW7A=ReM!PZjDqcxUWXb7U z%si_j4&TQUMK85Qd~|WeE{~^hhz8}ZVS9gs<0{5@a}%k1T*hABVQF}86yVV?wbEPQ zRp{~8(AxqefSZmnN+I^Ci@e%DclR?d`KA>i_N~f;FNve-m+@M;PxVoXbNE{rAL;!< zvJNM~pZ=)&tDcg7JQ@xF#Xp1E!%JK3w7z8@_i7_JSEu%`&}D~-l4mjh0ERRF0L_SR z;k;abq<){ecySI6c9bhy!5HWfY*v_ks(NP4=Yu(ne)Srk=-5<;+H0jUE!w*>g})1B z%zvT8H((gEcZB?uhU0is_LO|Wu*>~1)*z_8qq;{YCsEB0_wwn7^alzs`#^MtVSn|x zBL4jx!~X!25Z!}fZP3E+kxz_M4|dXznwc;rBAB|_(s{Oo*I9V}`pUo6aIH_(Zkkjt z+3UQR{{VWhFZH$}oHGz^@jK*Gjjp73y7BW0L%+|yIl03|J$a%hRcLjlM&SM&(l7ID zC`G9>?Ee7RY8{tUt+{{YR1#*VGJ79WvLwxXTeIDEoh1bTChfxZYwTSqGWm31rr zRSJKh!NnWC0;l_|4j6PYjSEWdb{zwkd+a`V?6;TqanFS^ zL#d!xk!5Y;YC7Cp_PYAp6QKdpfKw6@7)Vyjqq=UdE1^m1sxHi+?A>rhxc+?^fY!)kj4*CfcQVZAa-5pKHO#9bqRQy0o}#L%cC>KBfU~n7kOKJ2ZmoZ$OERa= zs&c-OWOTID5iv#1bDDn|YLBWzaHzj6+mFl)NZ;uK>K>sJ}nxAN{y=mPZ zuO5Ptq0F+lp5wzSDUX1A23P+8gk$Jj=;Rub4??;NUfUhkpP9V4D)L>h14?ikNoK)U zyG>Hs+bp^Eujzhc(+;Lnb#JH3?iznJtphrxONgkenB8gs9}38RD{ve8*bho|^uCv- zYUx$xDyu%$P)iOUkC;A#8ZE9gzE`a}SD$Gt>NT4y&M2g%om=jQ77RYBcCbE$afUiO zr@6jqsx=0hV=1Z1Gbw2+C1oVXEK;;q9mkjjV|!n3d}mnHY=OM+ZQWY1vm}y;fW7uw zDU)?x9L7shRHo@UPd9sW$2flF+SW&BN`k-P@BaWSR6L8KIi_1elSNxPJWA4STa&na zzx2YzHCB6)S4EfCq_tU`jw7IgD9cM+{{Z+g0r5zF=r+G>P-$_7)XXA{*C%f^c&Ngq zr;nKNr(Y#-Vb4WZl^=4SGXDUbvGZy=c(ZSFdcP90?!f|?Wk29R%s+-b>E}juCS#M+ z=6yz~e1;cq7A-xN)B!qzJ55C>xHab@yMizd^#N@e*LRZEl6ufr8AA~4^b zxhLvwajDW_6%sH$Q-gq1zlJ0;=(Z4+AP-;AKTncp)fu02HMSm#ET?*fy0WjjtS#C<5p}m z=7p&wV0_X2+(DKJBG+)GvUW&26lcxF#sQfL+TNHVGXx9qZvOxl6k?qk9!}*r9hf~y zu?advY!zTIr7W>}HVJNzb=g~K!z5~))fR2Z4&vLefmHIy-+J4y=#WOS*d7iOWQfNj z6CU(9ONT}9DZC0ojEMrfcKf(dRzXo^R!n?o%*_7)ZH9waOOt-8q9|jr zPJ3=Z9 z<5{x|!W!A8M3Z6_viM7OBlWl#s69>6)RI8@KoJ_EU$L$|Y8I@T?Qa&FOK3%8F)4{v}o0 zFR!W?S*L$%I$@= znK)J5_3wn5@(QY*t#6I?{{Sz~^1&85=mkJ5_fkZX5xhkE1O65BCpc5eWRfa{RhgpQ zbZ1p0*p3Ln0*eia?Yqsly^cGjAXFoVVG-q<*PladKIYw}1Y?V4y3#I_)wOp(bBwA3 zVKz%NJS!@p5D=hpE;oH~n7OqCkZ0A9$>emIm6vzILF9At#)*3}W~ot>oU&SWk9%1+ zwYRe+nYgu$#mDf!Y*1dN7o_Vpr-CMAjWa2cS8+RR#^UDJ{Om7)xM+B&djb>1MU08B zBYP%1l;_0Ty8$gN*>AZ20EYZ(iXwPgum-RQxy3l!y76kb+xb`bc||8$wCS5`X)4>7GiK(-do_r$IWaPznb{;R1s%t z#~$l1FeW)1_w>N486ySbrYa+)LF_p6ExA5y4dLVO3+su3n!z!hadD1^#4+!NZESiF zhrSZ%4VS_GYupO1!EwgZk43`bBdN(wwoJN&KZt)0Jn>Ef$JmN#yp(}CLwLlC9Cza2 zwmAj2a=47>0(eT~b!9(`9eCCs771h9k%;bvsn*JRBf@j&aoC#6%V9rp-Of4;1{p9l zIwp5ipehJldMX;;X528Hza4HkZ;}(Dc?VQ~#~ZFO+SG3KxA$>nVlbl)b(+Jp!JfwPaz zJtEe6t`F>WE^8IP4q+hw0OrD+JxSNlZSb|Gc$WM*q~HG5BdzDS$9^gP?jpL1o!hj0 zf|A@yuzqv%Dp`lC-A;>`_3m`1_p=5+)ZtbRx%FBWy6c?O+wsgB`h$p7X5z;J34ra0 zkHct=@sE<2%v!u1BzMfI?w{Hdt5F+`Up(Lb8lD+Hs$oh$X%4K$!2bZOkvjes%V0nJ zxUTCcI1tJ`e7J_}BM&>oK1yS8+)QXBKQ(0H_MGaXFWP1qeE$Ic7b}bWt%XRvsydY( z()9T?MZXqaM(^Om6>r2Pes~dP1oMcl!0^MoP5CJ!h;dK<0N7Qti`vUvD_(quC7be& zRsN5Kc)hN3Ew)-YdjL_W3OvkJ@{ttjZo7=AQomiiJ<~d?`ciAJUn=Jkv0P_g^h< z@+TRnB=dY&^gbfHgfPv8{%TO-+U~6jPh;!vNu}+n+BH89i$gH~0Oi7+KUz9dKW%MA z7x&fI`mQq3WqrRNYzQZD_pue+9YxX3A1~QSZx_`5W)G^?2zsB>S&MjD>n16ACGzvNzr%>G;M#7FKSd?HT_N3r=2pB%sWimA z#i??culO@4fBmc}MO&8CTix?IIj{ICkpBQfjDA^{)L{HIE;(K;^5YR5!OR})hvcR+ ziorU^^;-V`?(#bBkIoO_=L?!%IL5f5T8+sOe={!Y+ZxH{hi zS}bk~w&X1>y4#H|VH!#g0zU;Aeidur=3qj`{Ow=Gh7U_Cjc-n<>gINo%g>vU{d@g= zaUfR4U%#17G&)I3soF}oH|vYG48r52cmO5OYGmL zbzWHuR4$vZm-dRU+=8GYiBHj9H3$3S7_8yaMpoRcG5T??_dM4ltIO-4infBT28N=Z zbqyTRu(K-z!2}x|Pz`JB3!<~lO*MXx)pc50nnow~b!9KT!wvl-aLV@i2HZ!_2a9g2 z^03`y1st^xAc`gBzk1l+FJS(S*7W1qw=&k5>@7{4>mLSMcpYsdG*R5fTjXSCFK@!B zeoh+w9rhsUo`lrYx#p*@sMpz@JBc8Is-0k=M_xf_fnz0)Hg?AnP;L0~xW8kIQ!wYHHSG=5 zT-6~+D08~VE76fbQz?Z}?f|)9;m?1)i#wlcD6-XPDE7@&*`#hl{Rhn35nV-Ryi_!@ z9~;DPD)%J%_w9^Ni*d*#h|)rCPUUHM9vb+h6S!@%Z%G6QiQ(^&`o--D&^<%!cb!XDoKR;KHFF>u178Q zWvtu2NB&qrqSWGP914W8v5nbSd_#f=J*|p0W5qnVhQ(N^4>^UWaHhEP6`KBSuDA+J z#>zl{y@<-2HCX$*C_j07et1!evPNb%zV21A3{_oBF$SmO*2vJ?1IJq4?tuBW;kB36 zDcv00DfnCPoGMD2qq@J7_i-_@k}eYj4UySvAwPG_e|rELl)uE+{odF^azglLo8cO| zrlLA_D9(-B95ax)kQBLHTCz+d@|gbs7vjPM@Kec7$H(ye-wQ49-i}I>RKT+oKa1B2 z(X>@6&<1g}yv()$;y*i?y6I(-4Q*ag<1H#DiEoNs+ka7pE@zlbW@=?V@}F_J9DME# zyJ6d!WK~rZyJ>vzkGZz&zfp$VnMAotvD~4{d7Y#Klky$;!1uN1qJ5bXAG+2}Pq|g8 z6Vq#YeEz@n&KlXCpQNa%+dVvWa{l~=KjCaYd`gKGLsR)e`CD^a`2PUufRnvE#a!K3-N9A7(-DgUkx_!xB9A_8;tl= zx!K~?BUG-%DBDo81M@F#KhGaS z16#}TALog{=&P@3YxP$f*=I41J#Li7R`AKXt8iMwzvQ5H{p?mQxMc4Sv^KAakzjc9 zDFa2c23~z_Yv0h@oJ{`DRiCr^(UiuIvO`sEhmhfi^03|M&uk@oN9Ah=v|gfQ*|M^r zRRl&SU}XeyN3VaCunq@utKDv@7C9fZQ8zblvZqsJ;{4${S`_u&ht*XO?}VAC?9Fw> zxwQo7vB%M{Y!gB0V_!@GBnTmGsJL>yA?~n}TWRc

+Bd9TJ(& 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 literal 0 HcmV?d00001 diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 0000000..495d345 --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,42 @@ +

+ aoc +

+ +[![CI](https://github.com/sullivancolin/advent_of_code/actions/workflows/CI.yml/badge.svg)](https://github.com/sullivancolin/advent_of_code/actions) + +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/sullivancolin/advent_of_code) + +[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) + +[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/sullivancolin/advent-of-code) + +## Installation + +### Using the `devcontainter` +Click the button above to launch into Codespaces, or clone the repo and open in [VScode](https://code.visualstudio.com/). VScode will recognize the presence of devcontainer configuration and prompt you reopen the repository inside the container after building the Docker Image. + +### Manually +Before installing dependencies please make sure you have an accessible distribution of python 3.11 available and installed [poetry](https://python-poetry.org/). To create a new virtual environment and install all dependencies run +```sh +$ poetry install +``` + +## Running the solutions +The solutions for each day will be in its own sub package of the top level `aoc` package with one module for each part. All input data will be in the `data` directory labeled by day. The `tests` directory contains one module for each day with tests for both parts. The solution for each part can be printed by runing the include command line interface `aoc` with each day and part as subcommands. For example to get the solution to Day 1, Part 1, run +```sh +$ poetry run aoc day1 part1 data/day1.txt +``` + +To get more information on how to use the CLI just append `--help` to the command for example: +```sh +$ poetry run aoc --help +``` + +## Runing the tests +Each day has its own tests using the provided example input data. To run the tests for all days run `pytest` from the root directory. + +To run tests for a single day run `pytest tests/test_day1.py` + + +## Documentation +Documentation is provided via `mkdocs-material` and `mkdocstrings` and are generated from the source code, and host on github pages. \ No newline at end of file diff --git a/docs/docs/js/custom.js b/docs/docs/js/custom.js new file mode 100644 index 0000000..69b1c5d --- /dev/null +++ b/docs/docs/js/custom.js @@ -0,0 +1,125 @@ +document.querySelectorAll(".use-termynal").forEach(node => { + node.style.display = "block"; + new Termynal(node, { + lineDelay: 500 + }); +}); +const progressLiteralStart = "---> 100%"; +const promptLiteralStart = "$ "; +const pythonPromptLiteralStart = ">>> "; +const continuePromptLiteralStart = "| "; +const customPromptLiteralStart = "# "; +const termynalActivateClass = "termy"; +let termynals = []; + +function createTermynals() { + document + .querySelectorAll(`.${termynalActivateClass} .highlight`) + .forEach(node => { + const text = node.textContent; + const lines = text.split("\n"); + const useLines = []; + let buffer = []; + function saveBuffer() { + if (buffer.length) { + let isBlankSpace = true; + buffer.forEach(line => { + if (line) { + isBlankSpace = false; + } + }); + dataValue = {}; + if (isBlankSpace) { + dataValue["delay"] = 0; + } + if (buffer[buffer.length - 1] === "") { + // A last single
won't have effect + // so put an additional one + buffer.push(""); + } + const bufferValue = buffer.join("
"); + dataValue["value"] = bufferValue; + useLines.push(dataValue); + buffer = []; + } + } + for (let line of lines) { + if (line === progressLiteralStart) { + saveBuffer(); + useLines.push({ + type: "progress" + }); + } else if (line.startsWith(promptLiteralStart)) { + saveBuffer(); + const value = line.replace(promptLiteralStart, "").trimEnd(); + useLines.push({ + type: "input", + value: value + }); + } else if (line.startsWith(pythonPromptLiteralStart)) { + saveBuffer(); + const value = line.replace(pythonPromptLiteralStart, "").trimEnd(); + useLines.push({ + type: "python", + value: value + }); + } else if (line.startsWith(continuePromptLiteralStart)) { + saveBuffer(); + const value = line.replace(continuePromptLiteralStart, "").trimEnd(); + useLines.push({ + type: "continue", + value: value + }); + } else if (line.startsWith("// ")) { + saveBuffer(); + const value = "💬 " + line.replace("// ", "").trimEnd(); + useLines.push({ + value: value, + class: "termynal-comment", + delay: 0 + }); + } else if (line.startsWith(customPromptLiteralStart)) { + saveBuffer(); + const promptStart = line.indexOf(promptLiteralStart); + + if (promptStart === -1) { + console.log("Custom prompt found but no end delimiter", line); + var value = ""; + var prompt = line.replace(customPromptLiteralStart, "").trimEnd(); + } else { + var value = line.slice(promptStart + promptLiteralStart.length); + var prompt = line.slice(0, promptStart).replace(customPromptLiteralStart, ""); + } + useLines.push({ + type: "input", + value: value, + prompt: prompt + }); + } else { + buffer.push(line); + } + } + saveBuffer(); + const div = document.createElement("div"); + node.replaceWith(div); + const termynal = new Termynal(div, { + lineData: useLines, + noInit: true, + lineDelay: 500 + }); + termynals.push(termynal); + }); +} + +function loadVisibleTermynals() { + termynals = termynals.filter(termynal => { + if (termynal.container.getBoundingClientRect().top - innerHeight <= 0) { + termynal.init(); + return false; + } + return true; + }); +} +window.addEventListener("scroll", loadVisibleTermynals); +createTermynals(); +loadVisibleTermynals(); diff --git a/docs/docs/js/termynal.js b/docs/docs/js/termynal.js new file mode 100644 index 0000000..b66a4a3 --- /dev/null +++ b/docs/docs/js/termynal.js @@ -0,0 +1,273 @@ +/** + * termynal.js + * A lightweight, modern and extensible animated terminal window, using + * async/await. + * + * @author Ines Montani + * @version 0.0.1 + * @license MIT + */ + +'use strict'; + +/** Generate a terminal widget. */ +class Termynal { + /** + * Construct the widget's settings. + * @param {(string|Node)=} container - Query selector or container element. + * @param {Object=} options - Custom settings. + * @param {string} options.prefix - Prefix to use for data attributes. + * @param {number} options.startDelay - Delay before animation, in ms. + * @param {number} options.typeDelay - Delay between each typed character, in ms. + * @param {number} options.lineDelay - Delay between each line, in ms. + * @param {number} options.progressLength - Number of characters displayed as progress bar. + * @param {string} options.progressChar – Character to use for progress bar, defaults to █. + * @param {number} options.progressPercent - Max percent of progress. + * @param {string} options.cursor – Character to use for cursor, defaults to ▋. + * @param {Object[]} lineData - Dynamically loaded line data objects. + * @param {boolean} options.noInit - Don't initialise the animation. + */ + constructor(container = '#termynal', options = {}) { + this.container = (typeof container === 'string') ? document.querySelector(container) : container; + this.pfx = `data-${options.prefix || 'ty'}`; + this.originalStartDelay = this.startDelay = options.startDelay + || parseFloat(this.container.getAttribute(`${this.pfx}-startDelay`)) || 600; + this.originalTypeDelay = this.typeDelay = options.typeDelay + || parseFloat(this.container.getAttribute(`${this.pfx}-typeDelay`)) || 90; + this.originalLineDelay = this.lineDelay = options.lineDelay + || parseFloat(this.container.getAttribute(`${this.pfx}-lineDelay`)) || 1500; + this.progressLength = options.progressLength + || parseFloat(this.container.getAttribute(`${this.pfx}-progressLength`)) || 40; + this.progressChar = options.progressChar + || this.container.getAttribute(`${this.pfx}-progressChar`) || '█'; + this.progressPercent = options.progressPercent + || parseFloat(this.container.getAttribute(`${this.pfx}-progressPercent`)) || 100; + this.cursor = options.cursor + || this.container.getAttribute(`${this.pfx}-cursor`) || '▋'; + this.lineData = this.lineDataToElements(options.lineData || []); + this.loadLines() + if (!options.noInit) this.init() + } + + loadLines() { + // Load all the lines and create the container so that the size is fixed + // Otherwise it would be changing and the user viewport would be constantly + // moving as she/he scrolls + const finish = this.generateFinish() + finish.style.visibility = 'hidden' + this.container.appendChild(finish) + // Appends dynamically loaded lines to existing line elements. + this.lines = [...this.container.querySelectorAll(`[${this.pfx}]`)].concat(this.lineData); + for (let line of this.lines) { + line.style.visibility = 'hidden' + this.container.appendChild(line) + } + const restart = this.generateRestart() + restart.style.visibility = 'hidden' + this.container.appendChild(restart) + this.container.setAttribute('data-termynal', ''); + } + + /** + * Initialise the widget, get lines, clear container and start animation. + */ + init() { + /** + * Calculates width and height of Termynal container. + * If container is empty and lines are dynamically loaded, defaults to browser `auto` or CSS. + */ + const containerStyle = getComputedStyle(this.container); + this.container.style.width = containerStyle.width !== '0px' ? + containerStyle.width : undefined; + this.container.style.minHeight = containerStyle.height !== '0px' ? + containerStyle.height : undefined; + + this.container.setAttribute('data-termynal', ''); + this.container.innerHTML = ''; + for (let line of this.lines) { + line.style.visibility = 'visible' + } + this.start(); + } + + /** + * Start the animation and rener the lines depending on their data attributes. + */ + async start() { + this.addFinish() + await this._wait(this.startDelay); + + for (let line of this.lines) { + const type = line.getAttribute(this.pfx); + const delay = line.getAttribute(`${this.pfx}-delay`) || this.lineDelay; + + if (type == 'input') { + line.setAttribute(`${this.pfx}-cursor`, this.cursor); + await this.type(line); + await this._wait(delay); + } + else if (type == 'python') { + line.setAttribute(`${this.pfx}-cursor`, this.cursor); + await this.type(line); + await this._wait(delay); + } + else if (type == 'continue') { + line.setAttribute(`${this.pfx}-cursor`, this.cursor); + await this.type(line); + await this._wait(delay); + } + else if (type == 'progress') { + await this.progress(line); + await this._wait(delay); + } + + else { + this.container.appendChild(line); + await this._wait(delay); + } + + line.removeAttribute(`${this.pfx}-cursor`); + } + this.addRestart() + this.finishElement.style.visibility = 'hidden' + this.lineDelay = this.originalLineDelay + this.typeDelay = this.originalTypeDelay + this.startDelay = this.originalStartDelay + } + + generateRestart() { + const restart = document.createElement('a') + restart.onclick = (e) => { + e.preventDefault() + this.container.innerHTML = '' + this.init() + } + restart.href = '#' + restart.setAttribute('data-terminal-control', '') + restart.innerHTML = "restart ↻" + return restart + } + + generateFinish() { + const finish = document.createElement('a') + finish.onclick = (e) => { + e.preventDefault() + this.lineDelay = 0 + this.typeDelay = 0 + this.startDelay = 0 + } + finish.href = '#' + finish.setAttribute('data-terminal-control', '') + finish.innerHTML = "fast →" + this.finishElement = finish + return finish + } + + addRestart() { + const restart = this.generateRestart() + this.container.appendChild(restart) + } + + addFinish() { + const finish = this.generateFinish() + this.container.appendChild(finish) + } + + /** + * Animate a typed line. + * @param {Node} line - The line element to render. + */ + async type(line) { + const chars = [...line.textContent]; + line.textContent = ''; + this.container.appendChild(line); + + for (let char of chars) { + const delay = line.getAttribute(`${this.pfx}-typeDelay`) || this.typeDelay; + await this._wait(delay); + line.textContent += char; + } + } + + /** + * Animate a progress bar. + * @param {Node} line - The line element to render. + */ + async progress(line) { + const progressLength = line.getAttribute(`${this.pfx}-progressLength`) + || this.progressLength; + const progressChar = line.getAttribute(`${this.pfx}-progressChar`) + || this.progressChar; + const chars = progressChar.repeat(progressLength); + const progressPercent = line.getAttribute(`${this.pfx}-progressPercent`) + || this.progressPercent; + line.textContent = ''; + this.container.appendChild(line); + + for (let i = 1; i < chars.length + 1; i++) { + await this._wait(this.typeDelay); + const percent = Math.round(i / chars.length * 100); + line.textContent = `${chars.slice(0, i)} ${percent}%`; + if (percent > progressPercent) { + break; + } + } + } + + /** + * Helper function for animation delays, called with `await`. + * @param {number} time - Timeout, in ms. + */ + _wait(time) { + return new Promise(resolve => setTimeout(resolve, time)); + } + + /** + * Converts line data objects into line elements. + * + * @param {Object[]} lineData - Dynamically loaded lines. + * @param {Object} line - Line data object. + * @returns {Element[]} - Array of line elements. + */ + lineDataToElements(lineData) { + return lineData.map(line => { + let div = document.createElement('div'); + div.innerHTML = `${line.value || ''}`; + + return div.firstElementChild; + }); + } + + /** + * Helper function for generating attributes string. + * + * @param {Object} line - Line data object. + * @returns {string} - String of attributes. + */ + _attributes(line) { + let attrs = ''; + for (let prop in line) { + // Custom add class + if (prop === 'class') { + attrs += ` class=${line[prop]} ` + continue + } + if (prop === 'type') { + attrs += `${this.pfx}="${line[prop]}" ` + } else if (prop !== 'value') { + attrs += `${this.pfx}-${prop}="${line[prop]}" ` + } + } + + return attrs; + } +} + +/** +* HTML API: If current script has container(s) specified, initialise Termynal. +*/ +if (document.currentScript.hasAttribute('data-termynal-container')) { + const containers = document.currentScript.getAttribute('data-termynal-container'); + containers.split('|') + .forEach(container => new Termynal(container)) +} diff --git a/docs/docs/stylesheets/custom.css b/docs/docs/stylesheets/custom.css new file mode 100644 index 0000000..fc6036d --- /dev/null +++ b/docs/docs/stylesheets/custom.css @@ -0,0 +1,35 @@ +.termynal-comment { + color: var(--md-accent-fg-color); + font-style: italic; + display: block; +} + +.termy [data-ty="python"]:before { + content: '>>> '; +} + +.termy [data-ty="continue"]:before { + content: '| '; +} + +.termy [data-termynal] { + white-space: pre-wrap; + font-size: 80%; + font-family:'Fira Code', Consolas, Menlo, Monaco, 'Courier New', Courier, monospace; + padding: 30px 20px 10px 25px; + line-height: 1.0; +} + +a.external-link::after { + /* \00A0 is a non-breaking space + to make the mark be on the same line as the link + */ + content: "\00A0[↪]"; +} + +a.internal-link::after { + /* \00A0 is a non-breaking space + to make the mark be on the same line as the link + */ + content: "\00A0↪"; +} diff --git a/docs/docs/stylesheets/extra.css b/docs/docs/stylesheets/extra.css new file mode 100644 index 0000000..4fcb433 --- /dev/null +++ b/docs/docs/stylesheets/extra.css @@ -0,0 +1,59 @@ + +/* .md-typeset h3 { + font-weight: 700; +} + +.md-typeset h4 { + font-weight: 400 +} */ + +[data-md-color-scheme="brandwatch_light"] { + --md-primary-fg-color: #ffbe0a; + --md-primary-fg-color--light: #f7c334; + --md-primary-fg-color--dark: #ffbe0a; + --md-accent-fg-color: #A98bbc; + --md-accent-fg-color--light: #cba8e0; + --md-accent-fg-color--dark: #754c8f; +} + +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #A98bbc; + --md-primary-fg-color--light: #cba8e0; + --md-primary-fg-color--dark: #754c8f; + --md-accent-fg-color: #ffbe0a; + --md-accent-fg-color--light: #f7c334; + --md-accent-fg-color--dark: #ffbe0a; + --md-hue: 210; +} + + + +.md-nav__item .md-nav__link--active { + color: var(--md-accent-fg-color); +} + +.md-nav__item .md-nav__link--active:hover { + color: var(--md-primary-fg-color); +} + + +.md-nav__link:hover { + color: var(--md-primary-fg-color); +} + +:root > * { + --md-code-hl-string-color: #d19a02; +} + + +.md-logo { + filter: drop-shadow(2px 2px 4px black); +} + +.md-typeset a { + color: var(--md-accent-fg-color); +} + +.md-typeset a:hover { + color: var(--md-primary-fg-color); +} diff --git a/docs/docs/stylesheets/termynal.css b/docs/docs/stylesheets/termynal.css new file mode 100644 index 0000000..a253805 --- /dev/null +++ b/docs/docs/stylesheets/termynal.css @@ -0,0 +1,108 @@ +/** + * termynal.js + * + * @author Ines Montani + * @version 0.0.1 + * @license MIT + */ + +:root { + --color-bg: #252a33; + --color-text: #eee; + --color-text-subtle: #a2a2a2; +} + +[data-termynal] { + width: 750px; + max-width: 100%; + background: var(--color-bg); + color: var(--color-text); + font-size: 18px; + /* font-family: 'Fira Mono', Consolas, Menlo, Monaco, 'Courier New', Courier, monospace; */ + font-family: 'Roboto Mono', 'Fira Mono', Consolas, Menlo, Monaco, 'Courier New', Courier, monospace; + border-radius: 4px; + padding: 75px 45px 35px; + position: relative; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +[data-termynal]:before { + content: ''; + position: absolute; + top: 15px; + left: 15px; + display: inline-block; + width: 15px; + height: 15px; + border-radius: 50%; + /* A little hack to display the window buttons in one pseudo element. */ + background: #d9515d; + -webkit-box-shadow: 25px 0 0 #f4c025, 50px 0 0 #3ec930; + box-shadow: 25px 0 0 #f4c025, 50px 0 0 #3ec930; +} + +[data-termynal]:after { + content: 'python'; + position: absolute; + color: var(--color-text-subtle); + top: 5px; + left: 0; + width: 100%; + text-align: center; +} + +a[data-terminal-control] { + text-align: right; + display: block; + color: #aebbff; +} + +[data-ty] { + display: block; + line-height: 2; +} + +[data-ty]:before { + /* Set up defaults and ensure empty lines are displayed. */ + content: ''; + display: inline-block; + vertical-align: middle; +} + +[data-ty="input"]:before, +[data-ty-prompt]:before { + margin-right: 0.75em; + color: var(--color-text-subtle); +} + +[data-ty="input"]:before { + content: '$'; +} + +[data-ty][data-ty-prompt]:before { + content: attr(data-ty-prompt); +} + +[data-ty-cursor]:after { + content: attr(data-ty-cursor); + font-family: monospace; + margin-left: 0.5em; + -webkit-animation: blink 1s infinite; + animation: blink 1s infinite; +} + + +/* Cursor animation */ + +@-webkit-keyframes blink { + 50% { + opacity: 0; + } +} + +@keyframes blink { + 50% { + opacity: 0; + } +} diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 0000000..ca8983f --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,57 @@ +site_name: aoc +site_description: Record of current and past attempts at Advent-of-Code in Python +repo_url: https://github.com/sullivancolin/advent_of_code +repo_name: aoc + +edit_uri: "" +nav: + - Getting Started: index.md + - CLI: CLI.md + - Day 1: + - Part 1: day1/part1.md + - Part 2: day1/part2.md + +theme: + name: "material" + font: + text: "Roboto" + code: "Fira Code" + palette: + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/toggle-switch-off-outline + name: Switch to light mode + + - media: "(prefers-color-scheme: light)" + scheme: brandwatch_light + toggle: + icon: material/toggle-switch + name: Switch to dark mode + +plugins: + - search + - mkdocstrings: + handlers: + python: + options: + annotations_path: source + show_signature_annotations: true + separate_signature: true + members_order: source + +markdown_extensions: + - pymdownx.highlight + - pymdownx.superfences + - admonition + - markdown.extensions.toc: + permalink: true + toc_depth: 3 + +extra_css: + - "stylesheets/extra.css" + - "stylesheets/termynal.css" + - "stylesheets/custom.css" +extra_javascript: + - "js/termynal.js" + - "js/custom.js" diff --git a/poetry.lock b/poetry.lock index 74cb9e3..efabdcd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,44 +1,164 @@ +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. + [[package]] -name = "attrs" -version = "22.1.0" -description = "Classes Without Boilerplate" -category = "dev" +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" optional = false -python-versions = ">=3.5" - -[package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] [[package]] -name = "black" -version = "22.10.0" -description = "The uncompromising code formatter." -category = "dev" +name = "babel" +version = "2.13.1" +description = "Internationalization utilities" optional = false python-versions = ">=3.7" +files = [ + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, +] [package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" +setuptools = {version = "*", markers = "python_version >= \"3.12\""} [package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "certifi" +version = "2023.11.17" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -47,250 +167,1283 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "commonmark" version = "0.9.1" description = "Python parser for the CommonMark Markdown spec" -category = "main" optional = false python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] -name = "flake8" -version = "6.0.0" -description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" +name = "coverage" +version = "7.3.2" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "distlib" +version = "0.3.7" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "griffe" +version = "0.38.0" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false -python-versions = ">=3.8.1" +python-versions = ">=3.8" +files = [ + {file = "griffe-0.38.0-py3-none-any.whl", hash = "sha256:6a5bc457320e8e199006aa5fbb03e162f5e21abe31aa6221f7a5c37ea0724c71"}, + {file = "griffe-0.38.0.tar.gz", hash = "sha256:9b97487b583042b543d1e28196caee638ecd766c8c4c98135071806cb5333ac2"}, +] [package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.10.0,<2.11.0" -pyflakes = ">=3.0.0,<3.1.0" +colorama = ">=0.4" + +[[package]] +name = "identify" +version = "2.5.32" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.32-py2.py3-none-any.whl", hash = "sha256:0b7656ef6cba81664b783352c73f8c24b39cf82f926f78f4550eda928e5e0545"}, + {file = "identify-2.5.32.tar.gz", hash = "sha256:5d9979348ec1a21c768ae07e0a652924538e8bce67313a73cb0f681cf08ba407"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] -name = "isort" -version = "5.10.1" -description = "A Python utility / library to sort Python imports." -category = "dev" +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +i18n = ["Babel (>=2.7)"] [[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -category = "dev" +name = "lxml" +version = "4.9.3" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.35)"] + +[[package]] +name = "markdown" +version = "3.5.1" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, +] + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.5.3" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +jinja2 = ">=2.11.1" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "0.5.0" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, + {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, +] + +[package.dependencies] +Markdown = ">=3.3" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-material" +version = "9.4.14" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.4.14-py3-none-any.whl", hash = "sha256:dbc78a4fea97b74319a6aa9a2f0be575a6028be6958f813ba367188f7b8428f6"}, + {file = "mkdocs_material-9.4.14.tar.gz", hash = "sha256:a511d3ff48fa8718b033e7e37d17abd9cc1de0fdf0244a625ca2ae2387e2416d"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<2.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocstrings" +version = "0.24.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings-0.24.0-py3-none-any.whl", hash = "sha256:f4908560c10f587326d8f5165d1908817b2e280bbf707607f601c996366a2264"}, + {file = "mkdocstrings-0.24.0.tar.gz", hash = "sha256:222b1165be41257b494a9d29b14135d2b7ca43f38161d5b10caae03b87bd4f7e"}, +] + +[package.dependencies] +click = ">=7.0" +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=0.3.1" +mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +platformdirs = ">=2.2.0" +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.7.5" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings_python-1.7.5-py3-none-any.whl", hash = "sha256:5f6246026353f0c0785135db70c3fe9a5d9318990fc7ceb11d62097b8ffdd704"}, + {file = "mkdocstrings_python-1.7.5.tar.gz", hash = "sha256:c7d143728257dbf1aa550446555a554b760dcd40a763f077189d298502b800be"}, +] + +[package.dependencies] +griffe = ">=0.37" +mkdocstrings = ">=0.20" [[package]] name = "mypy" -version = "0.991" +version = "1.7.1" description = "Optional static typing for Python" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "mypy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340"}, + {file = "mypy-1.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49"}, + {file = "mypy-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5"}, + {file = "mypy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d"}, + {file = "mypy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a"}, + {file = "mypy-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7"}, + {file = "mypy-1.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51"}, + {file = "mypy-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a"}, + {file = "mypy-1.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28"}, + {file = "mypy-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42"}, + {file = "mypy-1.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1"}, + {file = "mypy-1.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33"}, + {file = "mypy-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb"}, + {file = "mypy-1.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea"}, + {file = "mypy-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82"}, + {file = "mypy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200"}, + {file = "mypy-1.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7"}, + {file = "mypy-1.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e"}, + {file = "mypy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9"}, + {file = "mypy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7"}, + {file = "mypy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe"}, + {file = "mypy-1.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce"}, + {file = "mypy-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a"}, + {file = "mypy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120"}, + {file = "mypy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6"}, + {file = "mypy-1.7.1-py3-none-any.whl", hash = "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea"}, + {file = "mypy-1.7.1.tar.gz", hash = "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2"}, +] [package.dependencies] -mypy-extensions = ">=0.4.3" -typing-extensions = ">=3.10" +lxml = {version = "*", optional = true, markers = "extra == \"reports\""} +mypy-extensions = ">=1.0.0" +typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" [[package]] name = "numpy" -version = "1.23.5" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" +version = "1.26.2" +description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, +] [[package]] name = "packaging" -version = "21.3" +version = "23.2" description = "Core utilities for Python packages" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, +] [[package]] name = "pandas" -version = "1.5.2" +version = "2.1.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acf08a73b5022b479c1be155d4988b72f3020f308f7a87c527702c5f8966d34f"}, + {file = "pandas-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cc4469ff0cf9aa3a005870cb49ab8969942b7156e0a46cc3f5abd6b11051dfb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35172bff95f598cc5866c047f43c7f4df2c893acd8e10e6653a4b792ed7f19bb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dfe0e65a2f3988e940224e2a70932edc964df79f3356e5f2997c7d63e758b4"}, + {file = "pandas-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0296a66200dee556850d99b24c54c7dfa53a3264b1ca6f440e42bad424caea03"}, + {file = "pandas-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:465571472267a2d6e00657900afadbe6097c8e1dc43746917db4dfc862e8863e"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04d4c58e1f112a74689da707be31cf689db086949c71828ef5da86727cfe3f82"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fa2ad4ff196768ae63a33f8062e6838efed3a319cf938fdf8b95e956c813042"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4441ac94a2a2613e3982e502ccec3bdedefe871e8cea54b8775992485c5660ef"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ded6ff28abbf0ea7689f251754d3789e1edb0c4d0d91028f0b980598418a58"}, + {file = "pandas-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca5680368a5139d4920ae3dc993eb5106d49f814ff24018b64d8850a52c6ed2"}, + {file = "pandas-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:de21e12bf1511190fc1e9ebc067f14ca09fccfb189a813b38d63211d54832f5f"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a5d53c725832e5f1645e7674989f4c106e4b7249c1d57549023ed5462d73b140"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7cf4cf26042476e39394f1f86868d25b265ff787c9b2f0d367280f11afbdee6d"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72c84ec1b1d8e5efcbff5312abe92bfb9d5b558f11e0cf077f5496c4f4a3c99e"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f539e113739a3e0cc15176bf1231a553db0239bfa47a2c870283fd93ba4f683"}, + {file = "pandas-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc77309da3b55732059e484a1efc0897f6149183c522390772d3561f9bf96c00"}, + {file = "pandas-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:08637041279b8981a062899da0ef47828df52a1838204d2b3761fbd3e9fcb549"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b99c4e51ef2ed98f69099c72c75ec904dd610eb41a32847c4fcbc1a975f2d2b8"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7ea8ae8004de0381a2376662c0505bb0a4f679f4c61fbfd122aa3d1b0e5f09d"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd76d67ca2d48f56e2db45833cf9d58f548f97f61eecd3fdc74268417632b8a"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1329dbe93a880a3d7893149979caa82d6ba64a25e471682637f846d9dbc10dd2"}, + {file = "pandas-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:321ecdb117bf0f16c339cc6d5c9a06063854f12d4d9bc422a84bb2ed3207380a"}, + {file = "pandas-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:11a771450f36cebf2a4c9dbd3a19dfa8c46c4b905a3ea09dc8e556626060fe71"}, + {file = "pandas-2.1.3.tar.gz", hash = "sha256:22929f84bca106921917eb73c1521317ddd0a4c71b395bcf767a106e3494209f"}, +] [package.dependencies] numpy = [ - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, ] -python-dateutil = ">=2.8.1" +python-dateutil = ">=2.8.2" pytz = ">=2020.1" +tzdata = ">=2022.1" [package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] [[package]] name = "pathspec" -version = "0.10.2" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pipe" -version = "2.0" -description = "Module enablig a sh like infix syntax (using pipes)" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] [[package]] name = "platformdirs" -version = "2.5.4" +version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, +] [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] -name = "pycodestyle" -version = "2.10.0" -description = "Python style guide checker" -category = "dev" +name = "polars" +version = "0.19.19" +description = "Blazingly fast DataFrame library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "polars-0.19.19-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:812dbb0cc7027fd41ce6b3eaf100b94828fc082fab026409d48792e3e7014095"}, + {file = "polars-0.19.19-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21a334e18c83a259211ca6ec182498f3a89297fde9b8f75021c6881ff4411201"}, + {file = "polars-0.19.19-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d383fac392b08a6d5830c99f6e735a48e390c1535c8f1e67707fcaab6863ade5"}, + {file = "polars-0.19.19-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:eec0e72dce84b85c427bbf395d2e181f33e60677695b95ee2e87fed51043bdea"}, + {file = "polars-0.19.19-cp38-abi3-win_amd64.whl", hash = "sha256:6c9e597efac74f00ef9cdfd9ba8a9128ed24276916bd3d60adc6e604530e4b37"}, + {file = "polars-0.19.19.tar.gz", hash = "sha256:3e904d197aabf36e37fda263470eaf51ec92fb865cdea4f93947713480199303"}, +] + +[package.extras] +adbc = ["adbc_driver_sqlite"] +all = ["polars[adbc,cloudpickle,connectorx,deltalake,fsspec,gevent,matplotlib,numpy,pandas,pyarrow,pydantic,pyiceberg,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] +cloudpickle = ["cloudpickle"] +connectorx = ["connectorx (>=0.3.2)"] +deltalake = ["deltalake (>=0.13.0)"] +fsspec = ["fsspec"] +gevent = ["gevent"] +matplotlib = ["matplotlib"] +numpy = ["numpy (>=1.16.0)"] +openpyxl = ["openpyxl (>=3.0.0)"] +pandas = ["pandas", "pyarrow (>=7.0.0)"] +pyarrow = ["pyarrow (>=7.0.0)"] +pydantic = ["pydantic"] +pyiceberg = ["pyiceberg (>=0.5.0)"] +pyxlsb = ["pyxlsb (>=1.0)"] +sqlalchemy = ["pandas", "sqlalchemy"] +timezone = ["backports.zoneinfo", "tzdata"] +xlsx2csv = ["xlsx2csv (>=0.8.0)"] +xlsxwriter = ["xlsxwriter"] [[package]] -name = "pyflakes" -version = "3.0.1" -description = "passive checker of Python programs" -category = "dev" +name = "pre-commit" +version = "3.5.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, + {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "pydantic" +version = "2.5.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-2.5.2-py3-none-any.whl", hash = "sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0"}, + {file = "pydantic-2.5.2.tar.gz", hash = "sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.14.5" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.14.5" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.14.5-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd"}, + {file = "pydantic_core-2.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66"}, + {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997"}, + {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093"}, + {file = "pydantic_core-2.14.5-cp310-none-win32.whl", hash = "sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720"}, + {file = "pydantic_core-2.14.5-cp310-none-win_amd64.whl", hash = "sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b"}, + {file = "pydantic_core-2.14.5-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459"}, + {file = "pydantic_core-2.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4"}, + {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada"}, + {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda"}, + {file = "pydantic_core-2.14.5-cp311-none-win32.whl", hash = "sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651"}, + {file = "pydantic_core-2.14.5-cp311-none-win_amd64.whl", hash = "sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077"}, + {file = "pydantic_core-2.14.5-cp311-none-win_arm64.whl", hash = "sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf"}, + {file = "pydantic_core-2.14.5-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093"}, + {file = "pydantic_core-2.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e"}, + {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69"}, + {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d"}, + {file = "pydantic_core-2.14.5-cp312-none-win32.whl", hash = "sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260"}, + {file = "pydantic_core-2.14.5-cp312-none-win_amd64.whl", hash = "sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36"}, + {file = "pydantic_core-2.14.5-cp312-none-win_arm64.whl", hash = "sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325"}, + {file = "pydantic_core-2.14.5-cp37-none-win32.whl", hash = "sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405"}, + {file = "pydantic_core-2.14.5-cp37-none-win_amd64.whl", hash = "sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588"}, + {file = "pydantic_core-2.14.5-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf"}, + {file = "pydantic_core-2.14.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b"}, + {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec"}, + {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124"}, + {file = "pydantic_core-2.14.5-cp38-none-win32.whl", hash = "sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867"}, + {file = "pydantic_core-2.14.5-cp38-none-win_amd64.whl", hash = "sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d"}, + {file = "pydantic_core-2.14.5-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7"}, + {file = "pydantic_core-2.14.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955"}, + {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5"}, + {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209"}, + {file = "pydantic_core-2.14.5-cp39-none-win32.whl", hash = "sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6"}, + {file = "pydantic_core-2.14.5-cp39-none-win_amd64.whl", hash = "sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3"}, + {file = "pydantic_core-2.14.5.tar.gz", hash = "sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" -version = "2.13.0" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" +name = "pymdown-extensions" +version = "10.5" +description = "Extension pack for Python Markdown." optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.5-py3-none-any.whl", hash = "sha256:1f0ca8bb5beff091315f793ee17683bc1390731f6ac4c5eb01e27464b80fe879"}, + {file = "pymdown_extensions-10.5.tar.gz", hash = "sha256:1b60f1e462adbec5a1ed79dac91f666c9c0d241fa294de1989f29d20096cfd0b"}, +] + +[package.dependencies] +markdown = ">=3.5" +pyyaml = "*" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +extra = ["pygments (>=2.12)"] [[package]] name = "pytest" -version = "7.2.0" +version = "7.4.3" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, +] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-html" +version = "4.1.1" +description = "pytest plugin for generating HTML reports" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_html-4.1.1-py3-none-any.whl", hash = "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71"}, + {file = "pytest_html-4.1.1.tar.gz", hash = "sha256:70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07"}, +] + +[package.dependencies] +jinja2 = ">=3.0.0" +pytest = ">=7.0.0" +pytest-metadata = ">=2.0.0" + +[package.extras] +docs = ["pip-tools (>=6.13.0)"] +test = ["assertpy (>=1.1)", "beautifulsoup4 (>=4.11.1)", "black (>=22.1.0)", "flake8 (>=4.0.1)", "pre-commit (>=2.17.0)", "pytest-mock (>=3.7.0)", "pytest-rerunfailures (>=11.1.2)", "pytest-xdist (>=2.4.0)", "selenium (>=4.3.0)", "tox (>=3.24.5)"] + +[[package]] +name = "pytest-metadata" +version = "3.0.0" +description = "pytest plugin for test session metadata" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest_metadata-3.0.0-py3-none-any.whl", hash = "sha256:a17b1e40080401dc23177599208c52228df463db191c1a573ccdffacd885e190"}, + {file = "pytest_metadata-3.0.0.tar.gz", hash = "sha256:769a9c65d2884bd583bc626b0ace77ad15dbe02dd91a9106d47fd46d9c2569ca"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[package.extras] +test = ["black (>=22.1.0)", "flake8 (>=4.0.1)", "pre-commit (>=2.17.0)", "tox (>=3.24.5)"] [[package]] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" [[package]] name = "pytz" -version = "2022.6" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "regex" +version = "2023.10.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" version = "12.6.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.6.3,<4.0.0" +files = [ + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, +] [package.dependencies] commonmark = ">=0.9.0,<0.10.0" @@ -299,235 +1452,207 @@ pygments = ">=2.6.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] +[[package]] +name = "ruff" +version = "0.1.6" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:88b8cdf6abf98130991cbc9f6438f35f6e8d41a02622cc5ee130a02a0ed28703"}, + {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c549ed437680b6105a1299d2cd30e4964211606eeb48a0ff7a93ef70b902248"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cf5f701062e294f2167e66d11b092bba7af6a057668ed618a9253e1e90cfd76"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:05991ee20d4ac4bb78385360c684e4b417edd971030ab12a4fbd075ff535050e"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87455a0c1f739b3c069e2f4c43b66479a54dea0276dd5d4d67b091265f6fd1dc"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:683aa5bdda5a48cb8266fcde8eea2a6af4e5700a392c56ea5fb5f0d4bfdc0240"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:137852105586dcbf80c1717facb6781555c4e99f520c9c827bd414fac67ddfb6"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd98138a98d48a1c36c394fd6b84cd943ac92a08278aa8ac8c0fdefcf7138f35"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0cd909d25f227ac5c36d4e7e681577275fb74ba3b11d288aff7ec47e3ae745"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8fd1c62a47aa88a02707b5dd20c5ff20d035d634aa74826b42a1da77861b5ff"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd89b45d374935829134a082617954120d7a1470a9f0ec0e7f3ead983edc48cc"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:491262006e92f825b145cd1e52948073c56560243b55fb3b4ecb142f6f0e9543"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ea284789861b8b5ca9d5443591a92a397ac183d4351882ab52f6296b4fdd5462"}, + {file = "ruff-0.1.6-py3-none-win32.whl", hash = "sha256:1610e14750826dfc207ccbcdd7331b6bd285607d4181df9c1c6ae26646d6848a"}, + {file = "ruff-0.1.6-py3-none-win_amd64.whl", hash = "sha256:4558b3e178145491e9bc3b2ee3c4b42f19d19384eaa5c59d10acf6e8f8b57e33"}, + {file = "ruff-0.1.6-py3-none-win_arm64.whl", hash = "sha256:03910e81df0d8db0e30050725a5802441c2022ea3ae4fe0609b76081731accbc"}, + {file = "ruff-0.1.6.tar.gz", hash = "sha256:1b09f29b16c6ead5ea6b097ef2764b42372aebe363722f1605ecbcd2b9207184"}, +] + +[[package]] +name = "setuptools" +version = "69.0.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, + {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shellingham" +version = "1.4.0" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" +files = [ + {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, + {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, +] + [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] -name = "typing-extensions" -version = "4.4.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" +name = "typer" +version = "0.7.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.7" - -[metadata] -lock-version = "1.1" -python-versions = "^3.11" -content-hash = "00ff1a237fb70f1c8f8af043ce0c5ab3cd4c5e0ae7e10bdf95b72393c320f62e" - -[metadata.files] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +python-versions = ">=3.6" +files = [ + {file = "typer-0.7.0-py3-none-any.whl", hash = "sha256:b5e704f4e48ec263de1c0b3a2387cd405a13767d2f907f44c1a08cbad96f606d"}, + {file = "typer-0.7.0.tar.gz", hash = "sha256:ff797846578a9f2a201b53442aedeb543319466870fbe1c701eab66dd7681165"}, ] -flake8 = [ - {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, - {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mypy = [ - {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, - {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, - {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, - {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, - {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, - {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, - {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, - {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, - {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, - {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, - {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, - {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, - {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, - {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, - {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, - {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, - {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, - {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, - {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, - {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, - {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, - {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, - {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, - {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} +rich = {version = ">=10.11.0,<13.0.0", optional = true, markers = "extra == \"all\""} +shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + +[[package]] +name = "typer-cli" +version = "0.0.13" +description = "Run Typer scripts with completion, without having to create a package, using Typer CLI." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer_cli-0.0.13-py3-none-any.whl", hash = "sha256:5ae0f99dce8f8f9669137a2c98eb42485cd4412e0ec225c8eb29ce8ac3378731"}, + {file = "typer_cli-0.0.13.tar.gz", hash = "sha256:f5b85764e56fb3fe835ed008ad5bc7db4961f7bcce1f1c1698ac46b6c5d9b86f"}, ] -numpy = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, - {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, - {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, - {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, - {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pandas = [ - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, - {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, - {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, - {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, - {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, - {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, - {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, - {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, -] -pathspec = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, -] -pipe = [ - {file = "pipe-2.0-py3-none-any.whl", hash = "sha256:12dc5baae854843d0fa8ab674ab555e58cc703eb64d8bf86da8db46b7115d07c"}, - {file = "pipe-2.0.tar.gz", hash = "sha256:a1cf3f29f98576b7e6552231142bc711e8dd324513a2c4525fc68c33f47fabad"}, -] -platformdirs = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -pycodestyle = [ - {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, - {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, -] -pyflakes = [ - {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, - {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, -] -pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + +[package.dependencies] +colorama = ">=0.4.3,<=0.5.0" +shellingham = ">=1.3.2,<=1.4.0" +typer = ">=0.4.0,<=0.7.0" + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, ] -pytz = [ - {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, - {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] -rich = [ - {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, - {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, + +[[package]] +name = "urllib3" +version = "2.1.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.25.0" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, ] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, ] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11.0" +content-hash = "586e123823a6f27fae4d22915bebe58dda66d919473683599a9ee34b5c715ec3" diff --git a/pyproject.toml b/pyproject.toml index 18d2b84..a5d69a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,28 +1,87 @@ [tool.poetry] -name = "advent-of-code" -version = "0.1.0" -description = "" +name = "aoc" +version = "0.1" +description = "Record of current and past attempts at Advent-of-Code in Python" authors = ["Colin Sullivan "] readme = "README.md" +[tool.poetry.scripts] +aoc = 'aoc.cli:cli' + [tool.poetry.dependencies] -python = "^3.11" -pipe = "^2.0" -pandas = "^1.5.2" -numpy = "^1.23.5" +python = "^3.11.0" +pandas = "^2.1.3" +pydantic = "^2.5.2" +typer = { extras = ["all"], version = "^0.7.0" } rich = "^12.6.0" +polars = "^0.19.19" +annotated-types = "^0.6.0" [tool.poetry.group.dev.dependencies] -isort = "^5.10.1" -pytest = "^7.2.0" -black = "^22.10.0" -flake8 = "^6.0.0" -mypy = "^0.991" +mypy = {extras = ["reports"], version = "^1.7.1"} +mkdocs-material = "^9.4.14" +pytest-html = "^4.1.1" +pre-commit = "^3.5.0" +coverage = "^7.3.2" +pytest = "^7.4.3" +ruff = "^0.1.6" +typer-cli = "^0.0.13" +mkdocstrings = {extras = ["python"], version = "^0.24.0"} [build-system] -requires = ["poetry-core"] +requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" + +[tool.mypy] +python_version = "3.11" +ignore_missing_imports = true +disallow_untyped_defs = true +plugins = "pydantic.mypy" +exclude = "archive" + [tool.pytest.ini_options] -addopts = "--ignore=archive" \ No newline at end of file +addopts = "--ignore=archive" + +[tool.coverage.html] +show_contexts = true + +[tool.coverage.report] +fail_under = 90 + +[tool.coverage.run] +parallel = true +dynamic_context = "test_function" +source = ["aoc"] +omit = ["cli.py"] + +[tool.coverage.paths] +source = ["src/aoc", "*/aoc", "*\\aoc"] + +[tool.ruff] +exclude = ["docs", "archive"] +ignore = [ + "E501", # line too long, handled by black + "B008", # do not perform function calls in argument defaults +] +line-length = 88 +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "C", # flake8-comprehensions + "B", # flake8-bugbear + "UP", # pyupgrade + "RUF100", # enforce that your noqa directives are "valid" +] +target-version = "py311" + +[tool.ruff.per-file-ignores] +"src/aoc/cli.py" = [ + "UP007", +] # Prevents rewriting `Optional[X]` to `X | None` which isn't supported yet in Typer. + +[tool.ruff.isort] +known-first-party = ["aoc"] diff --git a/src/aoc/__init__.py b/src/aoc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/aoc/cli.py b/src/aoc/cli.py new file mode 100644 index 0000000..0db684a --- /dev/null +++ b/src/aoc/cli.py @@ -0,0 +1,107 @@ +from importlib.metadata import version +from pathlib import Path + +import typer +from rich import print + +from aoc.day1.part1 import calibration_sum +from aoc.day1.part2 import word_calibration_sum + +__version__ = version(__package__) + + +def version_info() -> str: + """Helpful environment information for reproducible bug reports. + + Returns: + str: Nicely formatted environment info. + """ + import platform + import sys + from pathlib import Path + + info = { + "aoc version": __version__, + "install path": Path(__file__).resolve().parent, + "python version": sys.version, + "platform": platform.platform(), + } + return "\n".join( + "{:>30} {}".format(k + ":", str(v).replace("\n", " ")) for k, v in info.items() + ) + + +########################################################################## +# CLI command and subcommands # +# # +# # +########################################################################## + +cli = typer.Typer( + help="CLI interface for `aoc` package.", + rich_markup_mode="rich", +) + + +def version_callback(value: bool) -> None: + if value: + print(f"{__version__}") + raise typer.Exit() + + +@cli.callback() +def main( + version: bool = typer.Option( + None, + "--version", + "-v", + help="Print the current version.", + callback=version_callback, + is_eager=True, + ), +) -> None: + return + + +@cli.command() +def debug_version_info() -> None: + """Print debug information to terminal.""" + typer.echo(version_info()) + + +day1app = typer.Typer( + help="command for running day1 stars", + rich_markup_mode="rich", +) + + +@day1app.command(name="part1") +def day1part1( + input_path: Path = typer.Argument( + Path("data/day1.txt"), help="Path to file containing the input" + ), +) -> None: + """Calculate the sum of all the first and last digits on each line concatenated together.""" + with open(input_path) as infile: + input_text = infile.read() + total_sum = calibration_sum(input_text) + print( + f"The sum of the first and last calibration digits on each line is: [bold red]{total_sum}[/bold red]" + ) + + +@day1app.command(name="part2") +def day1part2( + input_path: Path = typer.Argument( + Path("data/day1.txt"), help="Path to file containing the input" + ), +) -> None: + with open(input_path) as infile: + input_text = infile.read() + total_sum = word_calibration_sum(input_text) + print( + f"The sum of the first and last calibration digits/words on each line is: [bold red]{total_sum}[/bold red]" + ) + + +cli.add_typer(day1app, name="day1") diff --git a/src/aoc/day1/__init__.py b/src/aoc/day1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/aoc/day1/part1.py b/src/aoc/day1/part1.py new file mode 100644 index 0000000..c3b6765 --- /dev/null +++ b/src/aoc/day1/part1.py @@ -0,0 +1,50 @@ +""" +# Day 1: Trebuchet?! + +Something is wrong with global snow production, and you've been selected to take a look. The Elves have even given you a map; on it, they've used stars to mark the top fifty locations that are likely to be having problems. + +You've been doing this long enough to know that to restore snow operations, you need to check all fifty stars by December 25th. + +Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one star. Good luck! + +You try to ask why they can't just use a weather machine ("not powerful enough") and where they're even sending you ("the sky") and why your map looks mostly blank ("you sure ask a lot of questions") and hang on did you just say the sky ("of course, where do you think snow comes from") when you realize that the Elves are already loading you into a trebuchet ("please hold still, we need to strap you in"). + +As they're making the final adjustments, they discover that their calibration document (your puzzle input) has been amended by a very young Elf who was apparently just excited to show off her art skills. Consequently, the Elves are having trouble reading the values on the document. + +The newly-improved calibration document consists of lines of text; each line originally contained a specific calibration value that the Elves now need to recover. On each line, the calibration value can be found by combining the first digit and the last digit (in that order) to form a single two-digit number. + +For example: + +```txt +1abc2 +pqr3stu8vwx +a1b2c3d4e5f +treb7uchet +``` + +In this example, the calibration values of these four lines are 12, 38, 15, and 77. Adding these together produces 142. + +Consider your entire calibration document. What is the sum of all of the calibration values? + + +## Solution: +""" +digits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} + + +def calibration_sum(text: str) -> int: + """Split input on newline, iterate over lines, extract digits, concatenate, convert to integer, then sum. + + Args: + text: Raw input text. + + Returns: + sum of all the concatenated first and last digits of each line. + + """ + lines = text.strip().split("\n") + nums = [] + for line in lines: + digit_chars = [char for char in line if char in digits] + nums.append(int("".join([digit_chars[0], digit_chars[-1]]))) + return sum(nums) diff --git a/src/aoc/day1/part2.py b/src/aoc/day1/part2.py new file mode 100644 index 0000000..e975085 --- /dev/null +++ b/src/aoc/day1/part2.py @@ -0,0 +1,72 @@ +""" +# Part Two + +Your calculation isn't quite right. It looks like some of the digits are actually spelled out with letters: one, two, three, four, five, six, seven, eight, and nine also count as valid "digits". + +Equipped with this new information, you now need to find the real first and last digit on each line. For example: + +```sh +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen +``` + +In this example, the calibration values are 29, 83, 13, 24, 42, 14, and 76. Adding these together produces 281. + +What is the sum of all of the calibration values? + +## Solution: +""" +import re + +word_to_digit = { + "one": "1", + "two": "2", + "three": "3", + "four": "4", + "five": "5", + "six": "6", + "seven": "7", + "eight": "8", + "nine": "9", +} + +word_pattern = re.compile( + r"(?=(one)|(two)|(three)|(four)|(five)|(six)|(seven)|(eight)|(nine)|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9))" +) + + +def word_calibration_sum(text: str) -> int: + """ + * Split input on newline + * iterate over lines + * extract word digts + * convert to integer strings + * concatenate + * converte to integers + * then sum. + + Args: + text: Raw input text. + + Returns: + sum of all the concatenated first and last word numbers of each line. + + """ + lines = text.strip().split("\n") + nums = [] + for line in lines: + matches: list[tuple[str, ...]] = word_pattern.findall(line) + digit_words = [word for tup in matches for word in tup if word] + digit_1 = digit_words[0] + digit_2 = digit_words[-1] + if digit_1 in word_to_digit: + digit_1 = word_to_digit[digit_1] + if digit_2 in word_to_digit: + digit_2 = word_to_digit[digit_2] + nums.append(int("".join([digit_1, digit_2]))) + return sum(nums) diff --git a/tests/test_day1.py b/tests/test_day1.py index fff3144..cda7961 100644 --- a/tests/test_day1.py +++ b/tests/test_day1.py @@ -1,27 +1,26 @@ -from advent_of_code.day1.part1 import calculate_max_calories -from advent_of_code.day1.part2 import calculate_top_3_total_calories +from aoc.day1.part1 import calibration_sum +from aoc.day1.part2 import word_calibration_sum -toy_data = """1000 -2000 -3000 +input_text = """1abc2 +pqr3stu8vwx +a1b2c3d4e5f +treb7uchet""" -4000 -5000 -6000 +def test_day1_part1() -> None: + """Test the sum of first and last calibration digits on the toy input.""" + assert calibration_sum(input_text) == 142 -7000 -8000 -9000 -10000""" +part2_input = """two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen""" -def test_part1() -> None: - result = calculate_max_calories(toy_data) - assert result == 24000 - - -def test_part2() -> None: - result = calculate_top_3_total_calories(toy_data) - assert result == 45000 +def test_day1_part2() -> None: + """Test the sum of first and last calibration digits spelled as words on the toy input.""" + assert word_calibration_sum(part2_input) == 281