pax_global_header00006660000000000000000000000064146775016310014524gustar00rootroot0000000000000052 comment=011be040704ba444775c4e1740cce63373def1af python-p1monitor-3.1.0/000077500000000000000000000000001467750163100147745ustar00rootroot00000000000000python-p1monitor-3.1.0/.devcontainer/000077500000000000000000000000001467750163100175335ustar00rootroot00000000000000python-p1monitor-3.1.0/.devcontainer/devcontainer.json000066400000000000000000000050041467750163100231060ustar00rootroot00000000000000{ "name": "${containerWorkspaceFolderBasename}", "image": "mcr.microsoft.com/devcontainers/base:ubuntu", "customizations": { "codespaces": { "openFiles": ["README.md"] }, "vscode": { "extensions": [ "GitHub.copilot", "GitHub.vscode-github-actions", "GitHub.vscode-pull-request-github", "Tyriar.sort-lines", "charliermarsh.ruff", "esbenp.prettier-vscode", "mhutchie.git-graph", "ms-python.python", "oderwat.indent-rainbow", "redhat.vscode-yaml", "ryanluker.vscode-coverage-gutters" ], "settings": { "[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.codeActionsOnSave": { "source.fixAll": true, "source.organizeImports": true } }, "coverage-gutters.customizable.context-menu": true, "coverage-gutters.customizable.status-bar-toggler-watchCoverageAndVisibleEditors-enabled": true, "coverage-gutters.showGutterCoverage": false, "coverage-gutters.showLineCoverage": true, "coverage-gutters.xmlname": "coverage.xml", "python.analysis.extraPaths": ["${workspaceFolder}/src"], "python.defaultInterpreterPath": ".venv/bin/python", "python.formatting.provider": "ruff", "python.linting.enabled": true, "python.linting.mypyEnabled": true, "python.linting.pylintEnabled": true, "python.testing.cwd": "${workspaceFolder}", "python.testing.pytestArgs": ["--cov-report=xml"], "python.testing.pytestEnabled": true, "ruff.importStrategy": "fromEnvironment", "ruff.interpreter": [".venv/bin/python"], "terminal.integrated.defaultProfile.linux": "zsh" } } }, "features": { "ghcr.io/devcontainers/features/git:1": {}, "ghcr.io/devcontainers/features/github-cli:1": {}, "ghcr.io/devcontainers-contrib/features/poetry:2": {}, "ghcr.io/devcontainers-contrib/features/pre-commit:2": {}, "ghcr.io/devcontainers/features/common-utils:2": { "installOhMyZsh": true }, "ghcr.io/devcontainers-contrib/features/zsh-plugins:0": { "plugins": "git zsh-autosuggestions zsh-syntax-highlighting zsh-completions", "omzPlugins": "https://github.com/zsh-users/zsh-autosuggestions.git https://github.com/zsh-users/zsh-syntax-highlighting.git https://github.com/zsh-users/zsh-completions.git" }, "ghcr.io/devcontainers/features/python:1": { "installTools": false } } } python-p1monitor-3.1.0/.gitattributes000066400000000000000000000000521467750163100176640ustar00rootroot00000000000000* text=auto eol=lf *.py whitespace=error python-p1monitor-3.1.0/.github/000077500000000000000000000000001467750163100163345ustar00rootroot00000000000000python-p1monitor-3.1.0/.github/CODEOWNERS000066400000000000000000000000311467750163100177210ustar00rootroot00000000000000.github/* @klaasnicolaas python-p1monitor-3.1.0/.github/FUNDING.yml000066400000000000000000000000571467750163100201530ustar00rootroot00000000000000--- github: klaasnicolaas ko_fi: klaasnicolaas python-p1monitor-3.1.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001467750163100205175ustar00rootroot00000000000000python-p1monitor-3.1.0/.github/ISSUE_TEMPLATE/bug_report.yml000066400000000000000000000030701467750163100234120ustar00rootroot00000000000000--- name: ๐Ÿž Bug Report description: File a bug/issue title: "" labels: - bug body: - type: checkboxes attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the bug you encountered. options: - label: I have searched the existing issues required: true - type: textarea attributes: label: Current Behavior description: A concise description of what you're experiencing. validations: required: false - type: textarea attributes: label: Expected Behavior description: A concise description of what you expected to happen. validations: required: false - type: textarea attributes: label: Steps To Reproduce description: Steps to reproduce the behavior. placeholder: | 1. In this environment... 2. With this config... 3. Run '...' 4. See error... validations: required: false - type: textarea attributes: label: Environment description: | Please describe your execution environment providing as much detail as possible render: Markdown validations: required: false - type: textarea attributes: label: Anything else? description: | Links? References? Anything that will give us more context about the issue you are encountering! Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. validations: required: false ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/ISSUE_TEMPLATE/config.yml��������������������������������������������0000664�0000000�0000000�00000000404�14677501631�0022505�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- blank_issues_enabled: true contact_links: - name: โ“ Ask a Question url: https://github.com/klaasnicolaas/python-p1monitor/discussions/new/choose about: We use GitHub issues for tracking bugs / feature requests, check discussions for questions. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/ISSUE_TEMPLATE/feature_request.yml�����������������������������������0000664�0000000�0000000�00000002267�14677501631�0024454�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: ๐Ÿš€ Feature Request description: Request a new feature or enhancement title: "<title>" labels: - enhancement - new-feature body: - type: checkboxes attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the feature you want. options: - label: I have searched the existing issues required: true - type: textarea attributes: label: How would this feature be useful? description: Describe any use cases this solves or frustrations it alleviates. validations: required: false - type: textarea attributes: label: Describe the solution you'd like description: If you have an idea on how to do this, let us know here! validations: required: false - type: textarea attributes: label: Describe alternatives you've considered description: If there's some workaround or alternative solutions, let us know here! validations: required: false - type: textarea attributes: label: Anything else? description: Any other relevant information or background. validations: required: false �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/PULL_REQUEST_TEMPLATE.md���������������������������������������������0000664�0000000�0000000�00000001410�14677501631�0022131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������## Proposed change <!-- Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue in the additional information section. --> ## Additional information <!-- Details are important, and help maintainers processing your PR. Please be sure to fill out additional details, if applicable. --> - This PR fixes or closes issue: fixes # ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. If you're unsure about any of these, don't hesitate to ask. We're here to help! --> - [ ] I have updated the documentation if needed. - [ ] I have updated the tests if needed. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/labels.yml�����������������������������������������������������������0000664�0000000�0000000�00000006243�14677501631�0020326�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - name: "breaking-change" color: d93f0b description: "A breaking change for existing users." - name: "bug" color: fc2929 description: "Inconsistencies or issues which will cause a problem for users." - name: "bugfix" color: ededed description: "Fixing a bug." - name: "documentation" color: 0052cc description: "Solely about the documentation of the project." - name: "enhancement" color: 1d76db description: "Enhancement of the code, not introducing new features." - name: "refactor" color: 1d76db description: "Improvement of existing code, not introducing new features." - name: "performance" color: 1d76db description: "Improving performance, not introducing new features." - name: "new-feature" color: 0e8a16 description: "New features or request." - name: "maintenance" color: 2af79e description: "Generic maintenance tasks." - name: "ci" color: 1d76db description: "Work that improves the continue integration." - name: "dependencies" color: 1d76db description: "Upgrade or downgrade of project dependencies." - name: "in-progress" color: fbca04 description: "Issue is currently being resolved by a developer." - name: "stale" color: fef2c0 description: "There has not been activity on this issue or PR for quite some time." - name: "no-stale" color: fef2c0 description: "This issue or PR is exempted from the stable bot." - name: "wontfix" color: ffffff description: "This issue or PR will not be fixed." - name: "cleanup" color: ef75d5 description: "Cleanup of code." - name: "sync" color: 00a6ed description: "Syncing with upstream github config repository." - name: "security" color: ee0701 description: "Marks a security issue that needs to be resolved asap." - name: "incomplete" color: fef2c0 description: "Marks a PR or issue that is missing information." - name: "invalid" color: fef2c0 description: "Marks a PR or issue that is missing information." - name: "duplicate" color: cfd3d7 description: "This issue or pull request already exists." - name: "beginner-friendly" color: 0e8a16 description: "Good first issue for people wanting to contribute to the project." - name: "help-wanted" color: 0e8a16 description: "We need some extra helping hands or expertise in order to resolve this." - name: "hacktoberfest" description: "Issues/PRs are participating in the Hacktoberfest." color: fbca04 - name: "hacktoberfest-accepted" description: "Issues/PRs are participating in the Hacktoberfest." color: fbca04 - name: "priority-critical" color: ee0701 description: "This should be dealt with ASAP. Not fixing this issue would be a serious error." - name: "priority-high" color: b60205 description: "After critical issues are fixed, these should be dealt with before any further issues." - name: "priority-medium" color: 0e8a16 description: "This issue may be useful, and needs some attention." - name: "priority-low" color: e4ea8a description: "Nice addition, maybe... someday..." - name: "major" color: b60205 description: "This PR causes a major version bump in the version number." - name: "minor" color: 0e8a16 description: "This PR causes a minor version bump in the version number." �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/release-drafter.yml��������������������������������������������������0000664�0000000�0000000�00000002450�14677501631�0022125�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name-template: "v$RESOLVED_VERSION" tag-template: "v$RESOLVED_VERSION" change-template: "- #$NUMBER $TITLE @$AUTHOR" sort-direction: ascending categories: - title: "๐Ÿšจ Breaking changes" labels: - "breaking-change" - title: "โœจ New features" labels: - "new-feature" - title: "๐Ÿ› Bug fixes" labels: - "bugfix" - title: "๐Ÿš€ Enhancements" labels: - "enhancement" - "refactor" - "performance" - title: "๐Ÿงฐ Maintenance" labels: - "maintenance" - "ci" - title: "๐Ÿ“š Documentation" labels: - "documentation" - title: "โฌ†๏ธ Dependency updates" collapse-after: 5 labels: - "dependencies" exclude-labels: - "sync" version-resolver: major: labels: - "major" - "breaking-change" minor: labels: - "minor" - "new-feature" patch: labels: - "bugfix" - "chore" - "ci" - "dependencies" - "documentation" - "enhancement" - "performance" - "refactor" default: patch template: | ## What's changed _To receive a notification on new releases, click on **Watch** > **Custom** > **Releases** on the top._ $CHANGES **Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/renovate.json��������������������������������������������������������0000664�0000000�0000000�00000002070�14677501631�0021051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "timezone": "Europe/Amsterdam", "schedule": ["before 6am every weekday"], "rebaseWhen": "behind-base-branch", "dependencyDashboard": true, "labels": ["dependencies"], "lockFileMaintenance": { "enabled": true, "automerge": true }, "commitMessagePrefix": "โฌ†๏ธ", "packageRules": [ { "matchManagers": ["poetry"], "addLabels": ["python"] }, { "matchManagers": ["poetry"], "matchDepTypes": ["dev"], "rangeStrategy": "pin" }, { "matchManagers": ["poetry"], "matchUpdateTypes": ["minor", "patch"], "automerge": true }, { "matchManagers": ["github-actions"], "addLabels": ["github_actions"], "rangeStrategy": "pin", "extractVersion": "^(?<version>v\\d+\\.\\d+\\.\\d+)$", "versioning": "regex:^v(?<major>\\d+)(\\.(?<minor>\\d+)\\.(?<patch>\\d+))?$" }, { "matchManagers": ["github-actions"], "matchUpdateTypes": ["minor", "patch"], "automerge": true } ] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/�����������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0020371�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/linting.yaml�����������������������������������������������0000664�0000000�0000000�00000012527�14677501631�0022730�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Linting # yamllint disable-line rule:truthy on: push: pull_request: workflow_dispatch: env: DEFAULT_PYTHON: "3.11" jobs: codespell: name: codespell runs-on: ubuntu-latest steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install Python dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Check code for common misspellings run: poetry run pre-commit run codespell --all-files ruff: name: Ruff runs-on: ubuntu-latest steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install Python dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Run Ruff linter run: poetry run ruff check --output-format=github . - name: ๐Ÿš€ Run Ruff formatter run: poetry run ruff format --check . pre-commit-hooks: name: pre-commit-hooks runs-on: ubuntu-latest steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install Python dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Check Python AST run: poetry run pre-commit run check-ast --all-files - name: ๐Ÿš€ Check for case conflicts run: poetry run pre-commit run check-case-conflict --all-files - name: ๐Ÿš€ Check docstring is first run: poetry run pre-commit run check-docstring-first --all-files - name: ๐Ÿš€ Check that executables have shebangs run: poetry run pre-commit run check-executables-have-shebangs --all-files - name: ๐Ÿš€ Check JSON files run: poetry run pre-commit run check-json --all-files - name: ๐Ÿš€ Check for merge conflicts run: poetry run pre-commit run check-merge-conflict --all-files - name: ๐Ÿš€ Check for broken symlinks run: poetry run pre-commit run check-symlinks --all-files - name: ๐Ÿš€ Check TOML files run: poetry run pre-commit run check-toml --all-files - name: ๐Ÿš€ Check XML files run: poetry run pre-commit run check-xml --all-files - name: ๐Ÿš€ Check YAML files run: poetry run pre-commit run check-yaml --all-files - name: ๐Ÿš€ Detect Private Keys run: poetry run pre-commit run detect-private-key --all-files - name: ๐Ÿš€ Check End of Files run: poetry run pre-commit run end-of-file-fixer --all-files - name: ๐Ÿš€ Trim Trailing Whitespace run: poetry run pre-commit run trailing-whitespace --all-files pylint: name: pylint runs-on: ubuntu-latest steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install Python dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Run pylint run: poetry run pre-commit run pylint --all-files yamllint: name: yamllint runs-on: ubuntu-latest steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install Python dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Run yamllint run: poetry run yamllint . �������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/lock.yaml��������������������������������������������������0000664�0000000�0000000�00000001006�14677501631�0022202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Lock # yamllint disable-line rule:truthy on: schedule: - cron: "0 3 * * *" workflow_dispatch: jobs: inactivity-lock: name: Lock issues and PRs runs-on: ubuntu-latest permissions: issues: write pull-requests: write steps: - name: ๐Ÿ”’ Lock closed issues and PRs uses: klaasnicolaas/action-inactivity-lock@v1.1.1 with: days-inactive-issues: 30 lock-reason-issues: "" days-inactive-prs: 1 lock-reason-prs: "" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/pr-labels.yaml���������������������������������������������0000664�0000000�0000000�00000001040�14677501631�0023131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: PR Labels # yamllint disable-line rule:truthy on: pull_request_target: types: - opened - labeled - unlabeled - synchronize workflow_call: jobs: validate: name: Verify runs-on: ubuntu-latest steps: - name: ๐Ÿท Verify PR has a valid label uses: klaasnicolaas/action-pr-labels@v2.0.1 with: valid-labels: >- breaking-change, bugfix, documentation, enhancement, sync, refactor, performance, new-feature, maintenance, ci, dependencies ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/release-drafter.yaml���������������������������������������0000664�0000000�0000000�00000000675�14677501631�0024332�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Release Drafter # yamllint disable-line rule:truthy on: push: branches: - main workflow_dispatch: jobs: update_release_draft: name: โœ๏ธ Draft release runs-on: ubuntu-latest permissions: contents: write pull-requests: read steps: - name: ๐Ÿš€ Run Release Drafter uses: release-drafter/release-drafter@v6.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} �������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/release.yaml�����������������������������������������������0000664�0000000�0000000�00000004444�14677501631�0022703�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Release # yamllint disable rule:line-length # yamllint disable-line rule:truthy on: release: types: - published env: DEFAULT_PYTHON: "3.11" jobs: release: name: Releasing to PyPi runs-on: ubuntu-latest environment: release permissions: id-token: write steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install dependencies run: poetry install --no-interaction - name: ๐Ÿ— Set package version run: | version="${{ github.event.release.tag_name }}" version="${version,,}" version="${version#v}" poetry version --no-interaction "${version}" - name: ๐Ÿ— Build package run: poetry build --no-interaction - name: ๐Ÿš€ Publish package to PyPi uses: pypa/gh-action-pypi-publish@release/v1 tweet: name: ๐Ÿฆ Tweet the release runs-on: ubuntu-latest needs: release steps: - uses: Eomm/why-don-t-you-tweet@v2.0.0 with: # GitHub event payload # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release tweet-message: | โฌ†๏ธ ${{ github.event.release.tag_name }} of ${{ github.event.repository.name }} just released ๐ŸŽ‰ #update @klaasnicolaas #python #package #P1monitor #p1 #ztatz #release #bot #assistant Check out the release notes here: ${{ github.event.release.html_url }} env: # Get your tokens from https://developer.twitter.com/apps TWITTER_CONSUMER_API_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }} TWITTER_CONSUMER_API_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET }} TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }} TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/stale.yaml�������������������������������������������������0000664�0000000�0000000�00000002660�14677501631�0022371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Stale # yamllint disable-line rule:truthy on: schedule: - cron: "0 1 * * *" workflow_dispatch: jobs: stale: name: ๐Ÿงน Clean up stale issues and PRs runs-on: ubuntu-latest permissions: issues: write pull-requests: write steps: - name: ๐Ÿš€ Run stale uses: actions/stale@v9.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 30 days-before-close: 7 remove-stale-when-updated: true stale-issue-label: "stale" exempt-issue-labels: "no-stale,help-wanted" stale-issue-message: > There hasn't been any activity on this issue recently, so we clean up some of the older and inactive issues. Please make sure to update to the latest version and check if that solves the issue. Let us know if that works for you by leaving a comment ๐Ÿ‘ This issue has now been marked as stale and will be closed if no further activity occurs. Thanks! stale-pr-label: "stale" exempt-pr-labels: "no-stale" stale-pr-message: > There hasn't been any activity on this pull request recently. This pull request has been automatically marked as stale because of that and will be closed if no further activity occurs within 7 days. Thank you for your contributions. ��������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/sync-labels.yaml�������������������������������������������0000664�0000000�0000000�00000001012�14677501631�0023463�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Sync labels # yamllint disable-line rule:truthy on: push: branches: - main paths: - .github/labels.yml workflow_dispatch: jobs: labels: name: โ™ป๏ธ Sync labels runs-on: ubuntu-latest permissions: pull-requests: write steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿš€ Run Label Syncer uses: micnncim/action-label-syncer@v1.3.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/tests.yaml�������������������������������������������������0000664�0000000�0000000�00000004370�14677501631�0022423�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Testing # yamllint disable-line rule:truthy on: push: pull_request: workflow_dispatch: env: DEFAULT_PYTHON: "3.11" jobs: pytest: name: Python ${{ matrix.python }} runs-on: ubuntu-latest strategy: matrix: python: ["3.11", "3.12"] steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ matrix.python }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ matrix.python }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Run pytest run: poetry run pytest --cov src tests - name: โฌ†๏ธ Upload coverage artifact uses: actions/upload-artifact@v4.4.0 with: name: coverage-${{ matrix.python }} include-hidden-files: true path: .coverage coverage: runs-on: ubuntu-latest needs: pytest steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 with: fetch-depth: 0 - name: โฌ‡๏ธ Download coverage data uses: actions/download-artifact@v4.1.8 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: 'poetry' - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Process coverage results run: | poetry run coverage combine coverage*/.coverage* poetry run coverage xml -i - name: ๐Ÿš€ Upload coverage report uses: codecov/codecov-action@v4.6.0 with: token: ${{ secrets.CODECOV_TOKEN }} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.github/workflows/typing.yaml������������������������������������������������0000664�0000000�0000000�00000001573�14677501631�0022575�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- name: Typing # yamllint disable-line rule:truthy on: push: pull_request: workflow_dispatch: env: DEFAULT_PYTHON: "3.11" jobs: mypy: name: mypy runs-on: ubuntu-latest steps: - name: โคต๏ธ Check out code from GitHub uses: actions/checkout@v4.2.0 - name: ๐Ÿ— Set up Poetry run: pipx install poetry - name: ๐Ÿ— Set up Python ${{ env.DEFAULT_PYTHON }} id: python uses: actions/setup-python@v5.2.0 with: python-version: ${{ env.DEFAULT_PYTHON }} cache: "poetry" - name: ๐Ÿ— Install workflow dependencies run: | poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ๐Ÿ— Install dependencies run: poetry install --no-interaction - name: ๐Ÿš€ Run mypy run: poetry run mypy examples src tests �������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.gitignore�������������������������������������������������������������������0000664�0000000�0000000�00000003323�14677501631�0016765�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ # Visual Studio Code .vscode # ruff .ruff_cache # Pyre type checker .pyre/ setup.py .python-version �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.pre-commit-config.yaml������������������������������������������������������0000664�0000000�0000000�00000007512�14677501631�0021262�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- repos: - repo: local hooks: - id: ruff-check name: ๐Ÿถ Ruff Linter language: system types: [python] entry: poetry run ruff check --fix require_serial: true stages: [commit, push, manual] - id: ruff-format name: ๐Ÿถ Ruff Formatter language: system types: [python] entry: poetry run ruff format require_serial: true stages: [commit, push, manual] - id: check-ast name: ๐Ÿ Check Python AST language: system types: [python] entry: poetry run check-ast - id: check-case-conflict name: ๐Ÿ”  Check for case conflicts language: system entry: poetry run check-case-conflict - id: check-docstring-first name: โ„น๏ธ Check docstring is first language: system types: [python] entry: poetry run check-docstring-first - id: check-executables-have-shebangs name: ๐Ÿง Check that executables have shebangs language: system types: [text, executable] entry: poetry run check-executables-have-shebangs stages: [commit, push, manual] - id: check-json name: ๏ฝ› Check JSON files language: system types: [json] entry: poetry run check-json - id: check-merge-conflict name: ๐Ÿ’ฅ Check for merge conflicts language: system types: [text] entry: poetry run check-merge-conflict - id: check-symlinks name: ๐Ÿ”— Check for broken symlinks language: system types: [symlink] entry: poetry run check-symlinks - id: check-toml name: โœ… Check TOML files language: system types: [toml] entry: poetry run check-toml - id: check-xml name: โœ… Check XML files entry: poetry run check-xml language: system types: [xml] - id: check-yaml name: โœ… Check YAML files language: system types: [yaml] entry: poetry run check-yaml - id: codespell name: โœ… Check code for common misspellings language: system types: [text] exclude: ^poetry\.lock$ entry: poetry run codespell - id: detect-private-key name: ๐Ÿ•ต๏ธ Detect Private Keys language: system types: [text] entry: poetry run detect-private-key - id: end-of-file-fixer name: โฎ Fix End of Files language: system types: [text] entry: poetry run end-of-file-fixer stages: [commit, push, manual] - id: mypy name: ๐Ÿ†Ž Static type checking using mypy language: system types: [python] entry: poetry run mypy - id: no-commit-to-branch name: ๐Ÿ›‘ Don't commit to main branch language: system entry: poetry run no-commit-to-branch pass_filenames: false always_run: true args: - --branch=main - id: poetry name: ๐Ÿ“œ Check pyproject with Poetry language: system entry: poetry check pass_filenames: false always_run: true - id: pylint name: ๐ŸŒŸ Starring code with pylint language: system types: [python] entry: poetry run pylint - id: pytest name: ๐Ÿงช Running tests and test coverage with pytest language: system types: [python] entry: poetry run pytest pass_filenames: false - id: trailing-whitespace name: โœ„ Trim Trailing Whitespace language: system types: [text] entry: poetry run trailing-whitespace-fixer stages: [commit, push, manual] - id: yamllint name: ๐ŸŽ— Check YAML files with yamllint language: system types: [yaml] entry: poetry run yamllint ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/.yamllint��������������������������������������������������������������������0000664�0000000�0000000�00000002432�14677501631�0016627�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- ignore: | .venv/lib .copier-answers.yml rules: braces: level: error min-spaces-inside: 0 max-spaces-inside: 1 min-spaces-inside-empty: -1 max-spaces-inside-empty: -1 brackets: level: error min-spaces-inside: 0 max-spaces-inside: 0 min-spaces-inside-empty: -1 max-spaces-inside-empty: -1 colons: level: error max-spaces-before: 0 max-spaces-after: 1 commas: level: error max-spaces-before: 0 min-spaces-after: 1 max-spaces-after: 1 comments: level: error require-starting-space: true min-spaces-from-content: 1 comments-indentation: level: error document-end: level: error present: false document-start: level: error present: true empty-lines: level: error max: 1 max-start: 0 max-end: 1 hyphens: level: error max-spaces-after: 1 indentation: level: error spaces: 2 indent-sequences: true check-multi-line-strings: false key-duplicates: level: error line-length: level: warning max: 120 allow-non-breakable-words: true allow-non-breakable-inline-mappings: true new-line-at-end-of-file: level: error new-lines: level: error type: unix trailing-spaces: level: error truthy: level: error ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/CODE_OF_CONDUCT.md�����������������������������������������������������������0000664�0000000�0000000�00000012545�14677501631�0017602�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socioeconomic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: - Demonstrating empathy and kindness toward other people - Being respectful of differing opinions, viewpoints, and experiences - Giving and gracefully accepting constructive feedback - Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience - Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: - The use of sexualized language or imagery, and sexual attention or advances of any kind - Trolling, insulting or derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or email address, without their explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at hello@student-techlife.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at [https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][mozilla coc]. For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][faq]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org [v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html [mozilla coc]: https://github.com/mozilla/diversity [faq]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations �����������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/CONTRIBUTING.md��������������������������������������������������������������0000664�0000000�0000000�00000002235�14677501631�0017227�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Contributing When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. Please note we have a code of conduct, please follow it in all your interactions with the project. ## Issues and feature requests You've found a bug in the source code, a mistake in the documentation or maybe you'd like a new feature? You can help us by submitting an issue to our [GitHub Repository][github]. Before you create an issue, make sure you search the archive, maybe your question was already answered. Even better: You could submit a pull request with a fix / new feature! ## Pull request process 1. Search our repository for open or closed [pull requests][prs] that relates to your submission. You don't want to duplicate effort. 1. You may merge the pull request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you. [github]: https://github.com/klaasnicolaas/python-p1monitor/issues [prs]: https://github.com/klaasnicolaas/python-p1monitor/pulls �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/LICENSE����������������������������������������������������������������������0000664�0000000�0000000�00000002065�14677501631�0016004�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# MIT License Copyright (c) 2021-2024 Klaas Schoute Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/README.md��������������������������������������������������������������������0000664�0000000�0000000�00000017342�14677501631�0016262�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Banner --> ![alt Banner of the P1 Monitor package](https://raw.githubusercontent.com/klaasnicolaas/python-p1monitor/main/assets/header_p1monitor-min.png) <!-- PROJECT SHIELDS --> [![GitHub Release][releases-shield]][releases] [![Python Versions][python-versions-shield]][pypi] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] [![License][license-shield]](LICENSE) [![GitHub Activity][commits-shield]][commits-url] [![PyPi Downloads][downloads-shield]][downloads-url] [![GitHub Last Commit][last-commit-shield]][commits-url] [![Open in Dev Containers][devcontainer-shield]][devcontainer] [![Build Status][build-shield]][build-url] [![Typing Status][typing-shield]][typing-url] [![Maintainability][maintainability-shield]][maintainability-url] [![Code Coverage][codecov-shield]][codecov-url] Asynchronous Python client for the P1 Monitor API. ## About There are many ways to read the serial port (P1) of your smart meter and what you do with the data that comes out. With this python library your platform can read [P1 Monitor][p1-monitor] via the API and use the data for example for an integration in [Home Assistant][home-assistant]. ## Installation ```bash pip install p1monitor ``` ## Usage ```python import asyncio from p1monitor import P1Monitor async def main(): """Show example on getting P1 Monitor data.""" async with P1Monitor(host="192.168.1.2", port=80) as client: smartmeter = await client.smartmeter() watermeter = await client.watermeter() settings = await client.settings() phases = await client.phases() print(smartmeter) print(watermeter) print(settings) print(phases) if __name__ == "__main__": asyncio.run(main()) ``` More examples can be found in the [examples folder](./examples/). ## Class: `P1Monitor` This is the main class that you will use to interact with the P1 Monitor. | Parameter | Required | Description | | --------- | -------- | -------------------------------------------- | | `host` | `True` | The IP address of the P1 Monitor. | | `port` | `False` | The port of the P1 Monitor. Default is `80`. | ## Data There is a lot of data that you can read via the API: ### SmartMeter - Gas Consumption - Power Consumption / Production - Energy Consumption Low/High - Energy Production Low/High - Energy Tariff Period ### Phases - Voltage phases L1/2/3 - Current Phases L1/2/3 - Power consumed phases L1/2/3 - Power Produced phases L1/2/3 ### WaterMeter > [!IMPORTANT] > WaterMeter is only available when you run version 1.1.0 or higher due the use of the new v2 API url. - Day Consumption (liters) - Total Consumption (m3) - Day Pulse count ### Settings - Gas Consumption Price - Energy Consumption Price Low/High - Energy Production Price Low/High ## Contributing This is an active open-source project. We are always open to people who want to use the code or contribute to it. We've set up a separate document for our [contribution guidelines](CONTRIBUTING.md). Thank you for being involved! :heart_eyes: ## Setting up development environment The simplest way to begin is by utilizing the [Dev Container][devcontainer] feature of Visual Studio Code or by opening a CodeSpace directly on GitHub. By clicking the button below you immediately start a Dev Container in Visual Studio Code. [![Open in Dev Containers][devcontainer-shield]][devcontainer] This Python project relies on [Poetry][poetry] as its dependency manager, providing comprehensive management and control over project dependencies. You need at least: - Python 3.11+ - [Poetry][poetry-install] Install all packages, including all development requirements: ```bash poetry install ``` Poetry creates by default an virtual environment where it installs all necessary pip packages, to enter or exit the venv run the following commands: ```bash poetry shell exit ``` Setup the pre-commit check, you must run this inside the virtual environment: ```bash pre-commit install ``` *Now you're all set to get started!* As this repository uses the [pre-commit][pre-commit] framework, all changes are linted and tested with each commit. You can run all checks and tests manually, using the following command: ```bash poetry run pre-commit run --all-files ``` To run just the Python tests: ```bash poetry run pytest ``` To update the [syrupy](https://github.com/tophat/syrupy) snapshot tests: ```bash poetry run pytest --snapshot-update ``` ## License MIT License Copyright (c) 2021-2024 Klaas Schoute Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. <!-- MARKDOWN LINKS & IMAGES --> [build-shield]: https://github.com/klaasnicolaas/python-p1monitor/actions/workflows/tests.yaml/badge.svg [build-url]: https://github.com/klaasnicolaas/python-p1monitor/actions/workflows/tests.yaml [commits-shield]: https://img.shields.io/github/commit-activity/y/klaasnicolaas/python-p1monitor.svg [commits-url]: https://github.com/klaasnicolaas/python-p1monitor/commits/main [codecov-shield]: https://codecov.io/gh/klaasnicolaas/python-p1monitor/branch/main/graph/badge.svg?token=G4FIVHJVZR [codecov-url]: https://codecov.io/gh/klaasnicolaas/python-p1monitor [devcontainer-shield]: https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode [devcontainer]: https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/klaasnicolaas/python-p1monitor [downloads-shield]: https://img.shields.io/pypi/dm/p1monitor [downloads-url]: https://pypistats.org/packages/p1monitor [license-shield]: https://img.shields.io/github/license/klaasnicolaas/python-p1monitor.svg [last-commit-shield]: https://img.shields.io/github/last-commit/klaasnicolaas/python-p1monitor.svg [maintenance-shield]: https://img.shields.io/maintenance/yes/2024.svg [maintainability-shield]: https://api.codeclimate.com/v1/badges/443c476612a574d82467/maintainability [maintainability-url]: https://codeclimate.com/github/klaasnicolaas/python-p1monitor/maintainability [project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg [pypi]: https://pypi.org/project/p1monitor/ [python-versions-shield]: https://img.shields.io/pypi/pyversions/p1monitor [typing-shield]: https://github.com/klaasnicolaas/python-p1monitor/actions/workflows/typing.yaml/badge.svg [typing-url]: https://github.com/klaasnicolaas/python-p1monitor/actions/workflows/typing.yaml [releases-shield]: https://img.shields.io/github/release/klaasnicolaas/python-p1monitor.svg [releases]: https://github.com/klaasnicolaas/python-p1monitor/releases [p1-monitor]: https://www.ztatz.nl/p1-monitor [home-assistant]: https://www.home-assistant.io [poetry-install]: https://python-poetry.org/docs/#installation [poetry]: https://python-poetry.org [pre-commit]: https://pre-commit.com ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/assets/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0016276�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/assets/header_p1monitor-min.png����������������������������������������������0000664�0000000�0000000�00000307030�14677501631�0023030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��ช�����ธด)>���gAMA��ฑ a���sRGB�ฎฮ้��� pHYs�� �� �šœ��๚PLTEGpL{{{wxy~ŽŽ€€€„„„zz{~~y]Lhzzzxyyxxx~~~|}}ะf4wxxะf3|||vwx™š›yyyyzzuuu7=>ttt{||pqpijjrsruvw}}~mnndddœœœ   ฯe2vvvlml !ooobccwwwhhhvwwz{{MPR9>@kkkruv?CEfffaa`{zxgggILNtvvฮ^Mh=@B€€€€RUV^``BFIyxtYZZํํํY\^ehiEIKอd0y] |ytUXYBA@lhaFEC@IP]]]ŸŸŸcfgบb1IRYณ`1y^QRRolf`hn:DMzwpowzQZa~|wEMT9@GM[gW_d|€nsw}{ty{WVTNV\Oi[djBP\w|~urnS`iZhrPPNqok %)HVavwp(*,hd_hpv.02rk`vph\YUa\Vamu644_WNUcntmdd`[xslldZelqjoqSLFMLJimmณณณIIHวศศRj!w`i`V€€|Tj*VPKy~MHCXTOJC>mrs:IWiuz.:F&##ŠŠŠ———“”“}wlcry^cfe\Qซซช+3;๘๗๖phYพพพ8pŸ".<Gagoe8/)๕๕๕{td/(%Ui7@6.7vช47;cqF]RG]kPฦd2YjDzf+zj9mfN fqJ=1rwgneBzpPbm\ำC;::ฮ` ภc1q{~[p/qa+t` mu[oc6{mDzd ะะะB<7hsQ^o:ฮb( )3XK>ฆฆฆeVG{sZaKpVอ=ูKๅๅไQE8T^ไฑ˜ฺŒf้รฐิwJบยฅ๒ืสแกƒ๘์็AX“škบTคฌ†Qsx>ovปrL^~™$lu๓ไ‰q)v‰MุีมนชyK\-›}Z)V\P€ฉ1biรฃ“m��� tRNS�eœ$Yจ๚๙�Š‘IDATxฺ์ฝ{PS๗ึ g|ฮ9 I€ภ„“`˜‘ˆ„�แ„„3\ส-ŒๅN †‹นษ5\†Q๔…ฑฬt๔T;ึK๋ฉึฑตตฺi{ฺiŸ3๓๋๕Ÿถs:๓ฬทฯœ™฿๚์หI แ*่^ถ’๋Fๅณ_y๏๕yฏต๋ฟโO๘ใ๗V'Aง%HทAจี๛<=ถบ oOˆภ/:}+Tผค๐ dุย฿฿ƒ๚'กโeำ7fท็โ๖ว?แOๅ2๔Di็he2#ำ”ีษJ>อ›B5ชฉ bตQํ๏ไ ๛ใโดำย4ถๆฝำ”j„๊„x๐ฅPM…j*จX"ช-ฑฌิฝ่šงPM…j*จXT/ ๋?ธ๚6 †Tฅฺ.—๓v๛นsŠPจKกšB๕ฦYŽชŽฐ?8#๕]~ ีช)TSAกzP ยฺ‘ิํ๚ˆลษแถ…วลyyปร^ ีTPจฆ‚Š• ฺำษ~ขหษ’!QญJH๐p ฝชฉ PM+Bต็v2ชwluCUฉท…‡ห“’ผ;E(TSAกš *V„jฒฎฃ—๋oBง'&สท…ซิ“B5ชฉ b=PMฬWม฿5ช้LfB Zญ๔๕uผชฉ PM+Eตงี๒ง�wPํํญTชถฉใ/…j*(TSAลJQํ`๑Wั฿MTK)TSAกš *ึWU[R ๒tีL__น\.p>E(TSAกš *VŠj0\V‘B5ชฉ bรชj\Vษำ-T๛‰ลแแษส๘ํnŸ"ชฉ PM+Fu@.ชB๕vกp6ฅ4ฤ}์Rจฆ‚B5Tฌ‚ชฦdu˜{จf'%m—ศ_ย)Bกš ีTPฑ จร๒๎ šพ;>><<RศกPM…j*จX_T{้ฟเ&ชใใๅ๒q …๊Mt:ิ0ฝ&aท(TSk๑ฅฎF๚j ฺ(Uํชร„ย๘x฿ฅ0—B๕:9ผvวผ.แ้IZpช7ฺj๔๖บฌฦภ@/?๏UQีคPMกšB5ช7:ชฝัฎข[Š0ืฯน•B๕f<7<=iฏKxA0)To\R๛๛ณูฏอj๔ํลdฎชรหำ=T๋ฏ>,‹…฿ถ, Š…bง%ะC,๋ซXถ—ใw‰ุŽล"cแ‡&พ฿rวv๋Ÿ_:#ˆ'‡— ฺใ5 ๚Rจธซั/0๖บฌฦฐ0฿฿UAu€[จ>๑; pงQq$๘M|ุF๊,ํ6์ฺใ˜ลb8mๆ;๙๛๙จL&6)n~‚:)ฌ'ว๎์ื†ิภjZ`เ:…๊Lธ}ฃ\ไัhซ€jOwPปฌ,pไ1หk{Tณ,ลiอย‰๎ ธI/qBa๗ท�ง0แฅฌญจމyH ใMกzƒฦ๖�6›ํ๑: ธฬ['T๊˜็ hbยยส]–3Tย>B๚,`ีถํ;ฒœไ\lY9๒๋r๗เภbใ…ทc_๐วผ 8ช].V/"ย“B๕2ึโB‹ัฒอ‰ี/ีกˆuฬภฌชJย YรฒX„{,ฒศ5uL€ฐยู^ฃ[G"ฐ…๚ <๎DmณHช๛ืe~46:ซCCƒ9Xpน\๔%44=Lฃm฿๎อคSจv{ญj4‘‘Iน“ช—ฑ็ํแมฦV##8ุผฑ/มมุƒ(ฑๅํฝ™Pํแล~™™๊จจ†ๆ ™™€€ฐ๕[พพ๋‚๊_ํSำึ yฟœAvTีค @‚&ท@–พ&งžI๚ๅCศณR*,g9šฟบฉ\ฌž|ฬ`คƒั™ม;A‚ƒCC!๛ไแ‡ \aotYณTTำh๐/เฮ๙/๔w}โั๒๓*+(Tปนญ"~~H’แซ1˜K\ ‚๑ลˆดHlยbุหqฉจฆัเ‰M s๙:Zhh@�อ%ชszณหส^9TNส ™5l)hย~กYu;$@ˆeฑy วญCbnšดถื๐6๎ฤ‹b~ฟปqn0ฝ=œฑPฤ็+Av!‘8>คˆ–๐E"ž�N6\Œ๔W ีšฆ†ฃัหๅ kj$!Iฎืึv๙๒™ฉZ ีฎRL&hF(‡หใ‰dh‡…งP8[Ž _&‹นPรษ|•Pšช’˜\ฃZฃ pตฃRปย…‚‚€W ีฅ7H™bปํ;k‚‚ๅCดo,ฐญศ๒a๙8stุ’)d3Ÿี bฟษ"ๅถY๖ว!ๅIN,ี "ชฤG(T“P]เี=ช—‹j…๊ีG๕ปฏชK'Y–-mlถูLx1ํณ๐ถขฃ(ท\tL>;มด}ข…ผใๆๅ๏ งคะก\ฎHฤ—D+่เ๓ฑ_^rอ้ŽภภP<๐”ส[ร…(O,‚7๒%–ทย๛\6{cๆฐษจ† ล††แa1O$‘ED44ศ๘<เ\ึภMx$*ช‡๑ร‡ฝะK%’Iฃ?‘Hกัˆd2พ่๚๋รWkk4๋๑#"ผข8"ัภ�:ชุ XžddPจvM่ะ`Oศ็Gฃ%-ๅ(‰„<พน๘j ถญล`|-ขลศ แ'‹ึ1P;˜แแฑ!™m๊ฆš‰L Hฤ“‚ZCh™VS#“ LาญญG/]อำ่ฅฐdh4M>OษงAˆCซ=|8oสP้่พD8Aฃ5ี๙B-aOZTœตขฑ๗พ‚ชšyƒe ห้ํE$๎+ TˆN<k‚รฮxํhž&KxยฆcBฦ&แ!J=ค1‚yฐ6eอ็ฃsN Kยำ“‡yฃัœ5Dฌ&Hpุ<ƒฑAๅตT'% d >B5?ZจfG5ไ๐ฃ“ŒF„๊ำปvUU™}iม"Qt๔ภd z?‰/ จ0lT๐๛ปŽ””@:Uำ€@แล•ษL&๔b!ฒฯjเ Es3…jWจฆั‚9<!c›WTt4 Z(F;$ม„ๅh[‹ ซz€๋A1’เั– พh‘Hภ…อ† น฿่ˆjQ4_ P(†x5 ัั““fTKข๙ร“ŒนนKgœัถด ‹8Yดd`�”ASƒ’รร\6W$S(8l@๕ูณg๒ Fะ2™D1<9Iร€/ใ๑เจF„j๘Dใ#TฟปYQํ๋เ๑ปs*ณzxARณ\v,;ญlฏŸYฮ,›•„ลr<๑! ุฟ) ุ:๔ฃ™ำ่'CฺE,ฦี '๘้ฐ@ก($:M8ธขแ‰‘ย–!I. ฑ”า3๔ ‹๊จิ†kืŠ‹G†2๏ฉ”สกก๔peกมืทt(=]žฉืฦ>พดkื™3•&IGfฆ\žฌLœŒS…ซGโrsปบ2ำๅrต^/‘œ~๒ฎCลลํc#๒๔๔tn/r|</ŽชJฎญŠ๊๊RฅgfยIDกฺ™`ุฑ>9แ“Ÿ'ยW#,F๓jฤj3{‘ลˆ›C,‹Qˆ]๏a๋ฎนมlpˆlคF{TฯnSIฅฐ๖ิสzX‚zพ@n_ฯเ BZYyํฺๅณ‡ฟ;S[ึ66‹Qญฮออ˜›ุถ-9นข"ซท={,m&๋๛๏wํ:rA_73;›™™žฎNVšLณณใแrtTญ6ทฌกฟ?=}dไๅ#›WU/€jบ๗ฏฌๅวN{Tืข+สY>,–ฑFม…ว"ฆ-%์–7๚8n<โฏpD5ฺ,ฆC@ƒศd@ื˜`ดพt œ, €ถ@�YnEPH’ื๐!™ ๊œ?>t่่ฝ#g]ธp๔่แณWง๔ปww]ปw๘๐aXลIใ—.๏ฺ๕w…นY]ƒ‡ฑ๕น๑่=GŽสk ?„?ถ->Kgwz๗ษษ๑ฏขฯœI“•_บ๔wG๏>{กชJฃ๙'xโ่Q ี  ฺฯ/4˜'2‹iบชkR ห๙k# ศ‹๙๘jT(d"'ิฯo#ฃz๔‡ฏwฺถํ๒ๅร฿นwญ!ƒ‘ืำ้ZP+~๚ ึุก ss__: ๏pIษ์ญŸvํบpAซญฟv=r๘ˆถP๚๑วปเ…y†๏ฟว่ป๊๊ฎ}้ะแ{Wฯž}๗]C‡เแฃG.ฤชฺ?€๎$ผ=V„j–ณยrัŸแฐGIK๔ฑoยฒK]“J#‹uxg~–eบ—ŽOlF0r{|”hฦำz@๊พ์e™=1a oบลห๒C2dฃ'8A๕w‡Tษ๗`อ^ศฬ<z๙jžV ้่‘#๗๎92“;ˆซjƒ)๋๛ำ๘cฺส4๔žซ™า™๘ฏฟ>rไ๊ฝ๐pyHˆYU cง๏]ฝzr€qIู—.ฝ๛n๚uj*?๔ืG/\MOงPํd;›้Mcฃฯy1พํ’ำB�I้e:qๅ� ๓aE&ๆมมฮ็ฝQฃชiท�ี‡ีj@๓กซjีฅK.ถศ๚g/]บบํ่‘๐*=Rี‡ช๚ศัmWiฌยP]\ฌซ˜€อ’ร๗`ํ้ iVU}ํฺีซ๗๎=rกถ๖ฺ๗GQหแจ๏ƒรรๅGัฒ฿ผนjO?'มพฑzชšƒd™f9์#Z;‚ฐl5,๛ ทm{ำ‡ลฒS$ˆlำJjจšใK01ป7BWฯŒy‘qyญ ‰–ˆxฐฐ ฒฏใˆ๊Ÿพ๛ฎฒ ใ๗ฟ๛ฮhใฃ๏^P(.]พzF฿฿q๖์TUว-X๕%%ขพฑKGฯœin~ฐ›๗๑ื ณ ธ๏ตB9/ญ92-q``N3ะ.๙๙ฝๅ‰3Yืฎ:ค.Tย{เ พ๔3ญญ—ฯžฉjlmฅrีŽปฺ์PH—v!f1ซ‡6ๆ"‘๑ัjWศdœ`ฺต3U k่‡.๏*๎6 5คฏL๘งC฿Vก•ูึ+3O็ๅ๕ำOGพำฮคใฬุ์Oปuw๏Žบ๖1ธ9fffr“Z[ฯžอซสj๊ํML์=}๖๐ิิ๗฿ฟจธ.๗ฺตณป๔q—.9ณO0ฑ™sี กšใŽvv j›YศSึM=ฦ?ฒ››ๅฌข„$ตๅปฑฝ)T;QีVTOšQพีUชฯ: ๚c๗Q}FHกšBต๛ช๚B]๗?!ฃ๚ะ‚จ>๓๎ต…P=e‡jคชกzำช๊ภ˜@g฿!Tฐำ‚]+’m;,ลมฒ‰?ษฺ้jโถขจษญ=XŽฝ ์{ุีภ๘8siณ†A+ุๅ=ธ?%“as–ํšVถา8กH‚NB‰„วc๘ฝ๔]็ช๚~วO ”งqU{ ฎ3ฑ˜ชjวUuNเๅห(ฉย<Pี๏พ[Xๆฅ™= ซGฮทด˜Qื7๔ฒ]ปไ…ษีป1T฿บRฉค–*!4กB!XฆC`gƒว[UB;c6x�๙X๛เ™ |้ป( ช๊K€๊ส~8tH[‡็:…ท1Tk4๏ฟ{ 6GฦfO๏:]ๆัึ.iุCน ๋žฑจ๊ศnŸ= k๑YUwๆ๐รู]สJ้ๅหyyรšMํซvŽjv(ร,ฐๅ‹ํ7+จ-Z๘ฬฺIศRง|ี&<'จตะคด ‹Xฮnษ„ุา$P7žp<(T;Uี8ชT_ฦP}๘ะYีgmจ>|่0B๕วฎP งว! ีช—ฃช;ฃ๚ะปจ>|่‚ีž8ชฯ:ข–ฑีGIจžยP๊ฉ๊`žMXlนaฏEŠถ"๑—c๏kG Ÿหกฐ…ž&m:ฒXDcตํ�L<ดษ›6ศ3๊Fำ แ:;๑ฬ%’๐„€}พกUuPะ%๐0ๅอฬde™Lถ\5l ‘‘!I‰ ชฟ+,‹ษoซฏK›;}๘HmmŽ๊นนฃเ"ั~ก]jชQไjU•�ฑไเ่ ไศ$ธƒeเ๓h๑ฟKฤb‹ัUพ๓ N>T‹ gA0ใe&ๆRีณVT› ๚Šฤ๘พ>„๊*__H€*ฎ(ŒŒœ™AŠHUG5wMHฅG/O้Z{ชg๒›Qžฃพ๋k,W}อŠj}n6z"คfS็ชPีT; ึNGbณ์๙โฤB.Rgฑœe:œ๔q0Zณ์z\“ฐฺฒ0bกL„ไ4_$ๆr“ำ+E5~ J!1ำ”HDฃm,T;จjศU_บpFQSXึjA5–ึ3เูUเชšำื64TYู;:~๊1Tww฿บuiื™ฦ 8!์T5†๊)…j3ช9‘ํeD‹y๗ไ๔JQm>™จR‚|"A๐BตUPกC%ก\1๏9 ีปwcน๊:S0ิญโจี;V^Xุำs้๒™3Sธชž้EyŽฌน๑ห‡IชหU_8ู0๖สฉjšUUณœIiw45นฐQC“JI-?์ๆุ๓ˆž=rห!๓>) [•ฯว๊พmวf{y๚๏!€ฒฉ†Kดขฐkh@ฝ—#wรฟธ—ืยฝQG0ฬล‡*ฎQ๙cป๗ฦUีรรƒ?ปฎ„0ต4๔\ถ‚Yฏcpศ‘ไdฅ4ัซ๊๙5ƒƒjuz๚ฝ#W++๛๛OŸ=’—ื egŠววฯž•WQื๗5œ††.ฟ๖f=ฐPร>ข@….Pœืwฦย“yยPC=@ฌp\$บh‰/ฟด4žฃีˆอ1]tu3ภลวแซาrŒ—• qญชต•3ฃณG'+ใ †a ืึฮฮ~}tิษ( ณช๖U=&—gf9’ืX๒๛าี ๚™ิŽiคฌจydT'์จ•้—^=Uอแน†๐โ‘2ชษ†ษฒl&Ž!':์F|ูษi‹ขNม"!^!\g=ผ``oฤ$ฤภ€L’ั฿ ล๔ v ล\Fฦภ�zdD„ฟง— QCฃqโ่่ศHHK.Pบ!TuKK่iผ๒ฅถŽ—฿๑๛PZ2ืu ,ึ‡พหCพj<W„]w}Wœg4ถต ข๗ไๆbkT้ขาฉ จfณฏ}R‰Pu๐บฃšษ„ิถ!‡บ:น#"Œh• _ผ{๗๚๋ืฏ฿ผ~wฟฎรƒw๏Fฏ2"^ณ]e ๓๕ๅ‰`ห&$„วGศRีฤmE}ทฉฏํใQถ๙ยTอ๖wBฎฉG~C‡ชชฬจ๖๔ศลเ… บ\“FƒsฆQ๗˜ฎ\Ek๎ ีUIฃ ธก8ๆา‘W-Wํ"โNข:‡ตUU;ดศ#ธจย›เ๖`Yัฤู1šHŠEV_ศๅ:_ฤhขp€—งohhSS_[ฎ ็ๆฃ!:Nํ[sssธาnkซij yฐ@^ฎMธ e ๕ดม:ั_:ชฃฯœ1•5_:sฆ  ฺ๋xฑึhlL๚่ี๐๐\7ฟy|๊ีย:~O๏้ำG†‡๋rg‹ฯT–D5อฮขš•พ""ขฆฏ๔ืWฏšLcงำฏƒš{าฤ์ำ™SSพ]?eๆMัhณ]ใG๏ษๅ๗๎้ซr_WTำQQ"HjิแCค„†.”v @#|กe€w๛6ศๆป@i า(ฎ _XDแฬFภ†ภ5ถ@ะฤูํ๋‰†๙Abฤชฝผ@Yฃc"”œoM๘œ–_UwvŽ๖ง_ีuๆŽŽยบหศoปw๔๊UuฃF๋บv๚จชฑฑฆfb0ปZRา?7v5ผฎ.ภ#งฟ+=่Qyžมิฅฑ฿฿ปชฏ5 น:๋๔ชชฎ2ท้Z พีย๓ร๗ tK•žž—WV๖Zกฺวg๙“'ฯž=y>ฟ0ซ{€X+Zรsํฺ๒Y+ฤY$36‹8รหฎr‘ะ—„๊”พ€ฑ ึ yz"ํ"ไg 8?|๘ลƒวฟ ๑goฟฆ๕6บ๗ญ7๐�c๗ญ[|>ุž^‹คพ!EษWDBŠ’ร๑ฃฟdTcดฆมgึE%Bกบ80ท”€(^†‰>}ฬ&ย๐G,๛TlKu' ๖๖$zย ๛‚๎ฃMฎ›พฟบจ๖๓‹ัžEดPศXd1าเบฮh�>฿DP>y๒ุม=oผ[nภop†„8x๐ไI„๐›ื๏^0ฝ็ห5‡้{!lwฟtT›—-ส่ฤผดซฬผ†Y_e^€ๆลe9อผ-Kาร๚z๋ƒ๋๋‚j–ใ.ขอŽ7๘ล฿,๑โษSนjr‚ุเšๅฌๅ4หn2นm‚"หมrm+œqเ๔RPะีๆฏob๎ozT›ฑ‹}Y;Tณ)Tฏ�ีˆีว,จ6ูŒ็=ถป๖จพปyQM[;Tำ^T/ฆจŸ‹ภš˜�ฑฏDtZdn฿˜ษษ๐�๛‰]6RงCศa;agLฬไค(c๎ฮ/พ8~“ฯภ`๔๕ฯ„ AŒ&฿๛m์มททฟxx๒"ณุe † P›-eฌฏำššXาPอd†๒„๐CWy…2ษlOศK฿…<(้ƒ<ร7ˆฑgฯย๗ุspY{<x์ุ•+น8l4๚๛,๔น�™h๐ข…ก๋›ด~ษณ_Bฌฯถโ‚>y\Q๖ไ๑ใวOžแท็๖SRœ์"๛ฅYv=N ฐy;ˆใั‰OJj๑๚ก:ƒB5…๊ข๚†๊7–ƒj\bSจ~ํPM[DUง<ฦฒ-B๚้ใ฿ะะ๎˜ซf๙8oุแCj‰jŸ NกฑŒ๋ิ๖ฑชi4@ฏa๐ ,aฦ4!มแvX_nฦ๕ƒ_|q‰k/&ะหa=า๐>jจ้ฉั<˜ช_mTำ™ x5ฃมช‰u๘p\^^"d๐ธy๓ไษ“fL๏qใลƒ๘6 ๕Atธ+8ฑE0Wล3ภมฉ„ZL  jF€%e๖)Tฏ+ช1R?๖ฑeฑ}žโ-˜�!4œv>–ๅคฏ‡๓iŒ„ไถต๐ŒjNรG…ช#xBศL?|ˆ0}ฦ ฉhทQmฦ๕qคฎo‰ะูแ$Yˆ UสขQQ ›Fก๚•G5‡ƒฺขGฃๆ4ง[%FใEิ †\DEปd5๙๎มƒฏฑฦI$ฎ˜Jiศ่๚d๓\ ีฏZฎSฎ>๓HRฯ๏๔!ฅ:ฐ”ศยนjg จ}์๒ึ8าŸ>{gห;p๏๑o[ถ๖ไฉ๓™0ค k็“gฯ%5๖อyช‘ส3ำ�‚๚–YPฟMิซHZƒธถH๋ž†š˜/;m64 ๕;š๗]ญดu:A�ีเเzb &XpQ฿h‰Lศใ8TษยขgŒ€w๑"๑0ซว1ค…—ฤfไ>hmG฿ล‹<AŒฏ—]jปฬƒฑŒh๘Œ@ฐ^—yฝผ|}_ซี่ตžชšT้ฒ๓)d;^8l"ฆ<Vฟ๐!๛EpZฮ?{fู|๒์ฑ๓9ใถ๔๕ำ[ถผจ~ถ‹็D฿๖uค\5Šg[;ตEUรนแ1ษ๋๏Gr๚ํU$ด3f#q ™kŒ—urีKอ ฉ0 c†฿ช_ซˆˆx้จ๖` P“$พLเฌ~œอŒ@ูilัน0^!ซญฬฦฤ๕ล‹“^NLJจ) „5?8ิo}Pเต{๗kตแƒi}Tตรฮbส›|#ศ“'8ž}v"ฑฤIฎ:e~หKฎโู–',–}‚รโ”ฦฟ>ู๒b๎<฿ฒๅ๑Sึ๓งไNN๐Šว[ถ<ตฏ"T;5†j*๒ๆภhไศ||ฑึจ๓Ÿี_€ฐฮi|๖]CPsš  #?h๋ฃซ‘ช~ญศฝLTฃ /ะB˜” vฮ0ฬ:› ฉม“w์ไชŠi'จs๐ุIฬลยzw€Cฉ› Wyhด€C[—ฑE€j_฿ืk9ฎชโ)1)๎<%n6ฮ“ุnVี8ช}pTMุr๐๎ถ oะษฯ๐ุ๖%ๅฌงŸ[%ธe?ัีถ?$ุ99๗x๐€œ›v4uฌHL“๏ข\ศ;<gž8Ax|4LรY‡V t/ฏ8H}ํยห‹๙2QํํอKะœMT%Ks๐{ฤLฝ{ๅ Vเ๒ฦ…‘ื น+:๚ั'>V ไ]เ็ฝจฃฟ^ซ‘น>จ&kjŒ‚ ช{j.FLมPmFฃฯ ็;‹ชYVTณฺzถ_`9xๅcาเ\–c๓=–•ิ)dTช%มย ฅPMก๚๕F๕ ีฏชอ+๐8ลB,bมฃฯc,[อฒ๋ึdงชฎ๓๓Oก(๑ผu+q๙๓๙งx"z-็!~๒ฝ์้<์_bZ๚๙ใ็๓ุQเ!œำุC๘Œ€j๒Ÿ6E&หiฝsF|๓อ5ฮ|ศ•ขƒใ๚ฮœœ@;๓บ ๆ yJAb{ญiM๗๕ฅPฝ^จfาะZญ>|}ํฒ `ฮ›œวว•+ธ+oฯฺกฺมส‡;ฎOž„=ฦษIปค5– ํ�-J๘์ต^^ฏชืีbฎผ‘rใฦผYGcคพax=๐ิฮ’BRี,Kไ้–-๓ุฆแ ,ํ3ป๓ฝb )ๆ!ss…<ม๎?C~็[^ภv>ล๗_`ชษคG ŸŸ‘๑๐!ิ‹ฏฒŠvj\[ƒ}/##"ยฑา›ญ"2(TฟBจ†™‰‰6นS`๛˜œฤ๖ญEแ๋‡j์ ์0^ฟ;0้้้่#ๅ dศXศ`Pจlจถ๓U›A}ใฦ๓ฟํฺ‰qฺสjฌ01e'xCžณœ'@๐ผRีี๏ผ๓ไ1ะ๗Rษ๐๔ณ็ฯแcดg๘๘-ฯ ๒๑ ๔ๅ)๋ –†๖;Ož?yเฮยQอzฑๅวฯŸรC>Tbผyวื|'ั ซญvฐ๏บ{Œป}๖a๘�๔Zใqึีฏ๖ู๒ฒPMง{0เ๓—%NœPr€�ฬœg.H\–uzๅ้LXฃDศ]ภำหn‘- มท‡&ๆฎ%ญ :v๋ฝชWi`PุŒๅฯ Uภ |๖๔้ำฯฬส:3‡<ูนชQฆรขช_เ๒x ๚๒฿j|ŽD4)Wํƒ๙AžเB๚)dVภว๗ุขชัC ๗Ÿพณๅน ี$Rใˆีิ^๏ Wวผ๖ร‡s 1v‰KศยxศX‹i4 ีฏชิธ๓อ*ภK 5˜๓ึ‹ฯ eฎึืฏวxฒ๊2๐ŠykZปHกzmQmึิŸA/คชoXฅ<~ `7<}ผ8ชอŠOอPฦฟ>ว๓ ่นg(uํˆjœๆ,๔ฺgุPz๛1^๔๒i ีฤDLQC|๚…ร^โบวoCพ;ทZ{ธ\ไ–"uณFe0–รo ;๎‘QฝๆFันํงl}E‰RP ชะณN$รg~สุLิืฏใอ๒xนสUœ_„ห<ป ธŽๆมEL_dฏฌษจF74Œฒ2ts/…๊•ข:ลฌฉฉ฿‚Lอ:๘G๕gfU จ~ถำฉYฯ์Žถๆชฑ|*pู‰ๅDะฏyจQdYT5 Cต†๊๘ฐฤy3ช}|ฬ๊๙™ีDA“๚Sˆ๓ฯ!�ื๏ศdŽE1ŒP่๕ฤๅฎซ‰จ ะ™ฅฅออฦ๛ีฑ๔—9d๏•CตททPค‰๒์/žhlz๒ุž—iซส>v์&์/ บา ?jˆ‚/\ป๎จDT#:”“ำู‰:[ฝขฌ^_T[Hึ[o=Aจฦุ™ีoYPฝ“Œ๊ยถขอWฉjฬี"†~cแ"๛)หYeณY;ญต2€jฬข7 Žด š˜ฐ‚zร ๚อทก๛^FFS“'›์ €–>|‰B!xxฏUีL&คMฃขฒฒŒe~p๓e\zข‹5พ/ีtบ7’:ตโฒ|ฑVพพB!๘>ŽmTฟ๑ ๚ๆ‹โเ`๛-@.C{อt5ี�j๔YQ“›๋็เๅR.๒ะjคฟจถIj�๕[๛Q:๚ญฯ,ฃฑpพs'žซf-ไซfQ ฟ0T#4ณ,จ&๛ชอชกฺึ š…กUฝ@‡'O!กฺิŸeƒ ร๕๑ใเsผRะ‰jEœ5jGIDu__|\ZB‚Jฅืล%$ึึ8ฐ๎ฌ†3ิฯoM%ิK@ต›ซ�…˜Cฦๆๅ/ธx์y†า6\Ÿผr๗.4ณป Fร฿$8xmfหP]šฺT^ž˜ฉึjณฒา*r_ย ุ่XXŒ;vlnT›วเฺาิoaฌศooฝ…มพุPู๕ ;๒iฎ๚ฉอbN€ ,ชฏ+Ÿวv๑\5‹eSี(5ฒๅฉญ๒กz็ฮ็D›N3ชํ@ˆ๓อ„๊[ ี•ชืีIช)Tฏ%ช1UMึิ ช็q8›ƒ€๊)พj<1omฺแ๓ฐYUในj‹ฯเ๛nยร๊ฦํsีHx๏ฟ ‹…ฃ๚7ฬ๙aษRcจถ“ิ๙หงชผqฬ P3>kRWJธล/<ykโฺ#ขบญ'M_a2q855อํiTฅ๒"Cffสช™[™EE0า)žo„ํžขขœๆ๘“ษ^Uำ™d๒gาjโ-q๊:F์‰Iบ?3ร๕•DšŸไ”กขฆA2“T]พOjO†Z2] –ๆไ$ๅ–ํ๕๋๋หอ •฿03ž˜แฒ๊อ…jvฐ(FBaฌS€|ิ(๓ฑ๑HึXd€\›P‚;6}Q]34dจ4q!z{๕ฺสฐํV‚––J!3Ih๑์(…๑ ๛๖0แSหMJ2ตD` ถ์63๛สส<JEอๆ๕–ิbดๆึNœI’๖ 8Ÿ‚?าฒ#VS“K8ฉ ถีฑื๔f—ิข๗Dix!p0o&ฏ™‰ ษ08bZZช7ช1๖AึทBีŠฮP /EีŠฮ:<ฝƒ'3ฐLฦผu[ัœ�D\2†UปrีๆหRe5T–_˜Qำำ–ฮzDPใฑกPz9=xุ?g‡j.Wฎ=ัšl็ุกZซ์zk๒3ฺหIจŽา4de eีถ2SS##“Z ะ ‘™•oFuCNVึพˆŒถ†DKTWำqT77gก๛ƒ Xay2wบ�CuNa฿๛ช[๛รร;qTgd์ซŒ8�จฎฌ๔ฺšฺื`0๐x!Yรศฐ™PอเศBภฃสถ๏…5ไ7ฏุ5ขPดพrๅ๎ฐ}I XAD"(ฮโ1ึีšš‘C๎dXXTTs3 บฺ†๊ขขfXuภgx™G,›™)(ุจ๖@-ถM&#†๊(>�žˆ*ส้อย—Œษ†๊าาŒๆ™Bต๙ู––ํฑด„gf",จ๎8ญl,9�w@)ฤ‡ ๎7D*ชฃ#ƒ๘I๏e›ีธำใ-[�๚™™๛IชuG}ฒ“ลฒฏVDฝ๐žc๕ใ/ฐขsWี(๒b๕ceอ"๗�ม5๗<๖JวAจฦิ4J€ VฉOฌํšpใ‡ิŸ.ีXใ้ใวฟ‚๘่‘ฏ๐น1+ณ‚ ’ž`7I€กฎ ขh‰๖้k„jziŸŸ2ฦำ“N/-ี๐$ๅๅ33ฦฒํธDtวลegึN2k::คา์์ธ CYYooœ4.!N*ํlไgdgงฅIฅ†\Ž๊๒zฉ^_]V=ฝจฝ# N—๎n:9สห““ ็งฮฉR}:๑จ†ดA…ฮT1:ชืO๑๚{uบœœlฅaบ`๓ šN …ฺพˆKษเฟ๚Q฿\้n">‚๋๋๒9)P—kจฆ9ธg…V(‰นxั฿Ÿlใpd2‰Dศ ]๕73ชc™ั รd`�ขฉ)2VŽ@ปญิๆfXuๅqบย๊๊ŒŒ,ฉ490 ๆฐ�•JCท ำรๅาธธธยBc \ฤ%&&$(“ ๋Z,จฆ๗๕ีIu•งN๕๔Hตq8ช๚zณใฐ%\iKFuj~F}vggS~๏P\ggQQน2m_โะP]]มฆ@๕ ’ฆฦe@ฬฒz~’ช~LhณGB5$9ถผxล†€W–MU›Q …-๘“Y>dˆีxใำgO–แƒ�G๕STg ! ขฺ^R/ีิภๆ ™a๑อ4_้‚‡s„๖ณ๖ุ 1สย๛ก๚DQjG‡^Ÿ[`Q ฑœฎ.ฝdฤ๎งฆถgŽ่๕##SS&fฮเ VซฌOฮำONŽ%็Iห๋รรป๋d=*y\\fบฎคGu๖Hr^Ž๊EE##J]…ีภ๊‰ UxE็4สืgส‹๕ำำT›Q=:ชีๆŸ์๊*.6อถOMed(U…็ง7ชQฮM ฏภ่สtr…Š5@๚ฯฟ๖B|๛ํทืวŽญXฒƒอ๚:คฌํkvx<๔—ฌช2ฺ“•ึ์Bฯ\ปR—›‹ฃ:ubB›งSk๏฿ ‡@/อoํ ฿ถญฑ$]ฤ *a‘iตF บlo—‡๋๊:-จ.mmอ —k OU๗๗ซ‹ฅ8ชsZ'TjXย™บF“ช›3G๊๊๚ฺรี็ฮ ฉค3i้้ีเ�นแ„ิ˜ไo๓HRฃภƒ๑–YU;๖ซถขš๕7dซ{็16ำลฒญˆ'@เ>ึเใู<พq่คZฟ c;ฯYTCl๔ศ‹๙ว[ฑ ฺ&ฉ?]*ช๑๑ˆ˜!๚ฤ'?ย/w๔=๚ศสlLb/`{p๋VOM)GบZ(S(ภ๋ตฺ๛9VU จึ้LถDp*Rณฆ์~~_yฆฒฐ"นa’มAฝพผ]™ง7{{ ใ›Uช๎:ล\{ฑzffh\ืXษแขฆๅ##UUงNaŸฉฉ™™R]a<ไJ|i<ะ™Šฑ1ญ2ž‘a‡๊pSหฐL40ะ฿ฏอ›)+.ฮVtMTUedŒภ)2“”4iพ\G฿:ขš๎อfรTŸh‘€Kส๗๚"ใLโ:vpน|>†d4'๔7_ฺโ›/แพ…ู฿"‰Q{9 f\ัrA ‡#’ภฅB่j๋j+ชk2ฒ”า้i๋b์kหJ5‹~ๆฬข|X€U ฝๅลyำำ๕#8ชS๛rโโาA)ไข‹ธมqicE{y^žฉEˆ:4ดท'หญŸ๒Lดฺ3ำ๓pT็Wdลฃ$JNk‚–ื๘ธพ*}+ี…552พธ&r|คป;งg"\^RาืงTลํKLOolœ‘ศ&—ฟพ.ชฺR๖BŽฯ [ื_1QŽj4uGe9ุ๕๕ษc!{4>j‘8่ึวคณAŠึGๆฑ{ฤ ŠO็Ÿ๎ฤJaฌij{Iํ.ชิ_ก}๒ใ{๏ฅF™รโ8พ๒OEรžHMอ?๗'Ÿ buํๅ ๋ใ๎๔็ุปรu'jG/`๘ญ ชcc‹::JJŒถ%Wิึฆื”ย“ุู*๙–น9y๑LAะ๘้ฦฦ Œrนพฅ]žFๅgคงืvgอfOAบฃ๋šTo8u ้Žte]YฤไŸTf’สส๐ตfpฐฑัt�*nฦฦ†Fิ$U;P>งHNNฒ0ฐo|<<ผถ3ฺ๋Xcck๋ˆJ>’ฌRึlxTำ™P4‚าบry@ฤ$€zyป‰ุ4� 4ฐ๙vS›อ@tฑต่ะ1*ŠอึhšnธูหญZ‡oxๅสลปห<Ž@†ฆ€ฎฒมฺšซ๎kํีWเ;า๘b,ŠLฮni1๏7ž>][+:ื.ฏซฮฬ๏iVฉ0r#๕๔้ „๊s็2U…uนm*Ung๒ม5bUๅๆรๅรžๅ˜K O•มต[^Zศ>“‰No@{&cc๚)์ฅfTwtจ๓ ‘ƒ๕%%ฝ๕Šซชzz”ลi !ฺ้้dน*%b่ีฑ3P›M วrีVTfžญศrฒญˆ5•fูฟุ๚S[&qํdYฆ ฆ ฦฤ`"Pด wดตfrิซ‚j[Xž‰ยPh๙จ๓ฦ@uฉ3Tcจ/!ขบศ-T็ป๊p ี๎ขZ<ฆ9ฎE+ชฃฌจ>ถฉPด๖จษฬ[1ช“7ชcฤNI๏,Bพ๚W ซี7ฬห}œ ์2มeYYlณEpKBธeส หสn–uŠ€ใข๓ริ‹ฃ GŸ�Ÿ #€Y€Œฮfc๛ฝ๗=f/นำคA๎™œ$ูป`LฎH" fฌ‰ฒwตตFฅ็ฮ56๑ลำZ_ฌ›Fช:ผ๒ภ่hxธJฅญ*DDnํSฉ๒๒ฆ๏7wีOU!T+ต†๊๊'๚งN™ึชZ)UŽŒhตฝO^q1๒ไE๕๗๋tู$T+•ษyฐอ˜Ÿ?”™'—ggW4*Ouw#TWไๆvuA"ๆ~๕ฦF5“ษA}l๒ั฿rK/#ว อ7ภg ร๙T๏šŒfXŒI1ฤชaaร<ถ#rƒพFิฦๅ๕Rq พฝปษM8<ิ|ŠฑƒนจNอ—T$า เ๕ฬNฤ=BE๙ HˆqT๏ุšฺfA๕VfTŽjๆ{๏e†všช+ีฅ}}่†9ฏL?‘ำี^RาีฅDจžU็)ณ‡Tชบบฒฝ[cฃZ[ๅ๒ยnฃล24–—ิ™5h๏FZŸ'อหkoืO%๖B)) ษ€ผh–Šj;B์Œำ๛Qโ๓๗๘Wณช๕๑_๖7็`ฌจfฑ,๕†,i– q`น ี,๛!ๅ ‘:e‘ไวสQM{ีQ]hFulซีฎQaAu3ี}™™ษ ก:หชฅช]ฃš็ี6‘ญ‰Z>ช฿8y์๚KEuฌช3GตŠ๊n;TOธ๊t3ชง๔๕จŽเจ.๓๙GN#0#Xฯ†ุทgO ณ๔๖‹yโHC{T[GtฑˆcธXึœหBk2ฦญ9GRง8‘ิqี๐๘ A(}๎\œ†ะดถ&‰`ทtˆึ็ฮฝ๗hำ๑+�๖Kqš<ภญ lRฏ=ก zํ3Wีp๑ุีฅซ2:`uRฯอ฿ูมT5–ซ7D๊t Rตั55ฟ!( ถย๋Pคสš�)*j”6VZ๖ภ‹ญP ๐G;0Bำkfปฆฆ ชท—ึŒษๅ##๒๐ผ’+ชๅrุq,ซ.*‚ิHrฒ^฿฿/ีสUส๓็[[•ชŠ:ป*76ช™L4Az~ฐ‰™ƒ�๘ฑคz i?KxFœv’z3‡คผ]&›œ๔t<สˆ ฬ๕ํ/ฑ„ศ็`\’oฏ^$|์ะhก<^tดL$Xฝ:Z›คฟ]ซฟ฿บ๓ฯeฉฅuuh9•ๆืdบB๕ <b2'@bS๛๛‘‹ศผbR๓{วA2dfชŠมUาะ”$ฌi>}บคคเ€ฆ&ฃพ^งภwืช3ๅrไue[›๚Gๅrตบ"ื�ข#Yืธห๛ีJภ๘ค๎์ฑAQV๘ห5–๒ภ ีO†ว_อ_Ÿ๘ฐเำIฎฺ‡ด—ศ"ฦrุDt> e?R์H้PแGŸx๎BŒ6G๊\Iษ0๋0‘ฮุX๖๚ร/I\ฟ๙๖_dศ 6ษยJBข‚UG๕‰ข|Hั้Mีงฌดผsง1ณ^Oีล†‚ฬLอูr=๊yV๊กฉiyQkFu‡ีใา’J๋w๑๓ใ๑ซkๆF‹‘^ำ515Uvสฏจa|ผธX%฿VุhE5Hv=(s8ฦ`ฆ\]U„†๎Fจ.<฿2:บแQํํ-–EIธ\ฒG/b๒๚๕%AL'AN ™iอBŒฦรฏนพ],†‘B ฟ UVmาพ ฌถN›q7c ฌF๒BpฐB-^ฝก‹VT็ฬNไiงงญ‹1ฝvUrw7†๊T ีย%กztฌ –ต฿ืžžŽฎ๏ฎljŠ0F•fŒ76เ๔4ฃีq€nEตJง(sMkฟJ%—Wt‚CD.ื5&หI—ww๓60ชส ~๙฿ถ—ิๆิ4สNCกโ ฅื็?ร .˜�!e–ใ8[:[ไท%5B&ต]šz!Iํ ีเสC–้Oฐ-ฤTจU]Q14เ๏น่ห`eBะVใG~ežๆnงน†‚kt5Wˆฆq0Vอ`mUีP––Vi2gงภYY……-ธYฏฏ-[.ญซœอห›ู” ฌl•าd+Z?'ก:rด<O;006(ญ‚ย‚ฑฬธ๎\tฺฑ^ 2šณyypLzรเXUUl*j"#ำาฒ๋ีแฺฺZ[Dšฌฎhi)-ํšQฉฺ†เ|ัlTร.–@�ฝฉEโะPขG/†‡Fบm›C5(Ÿฃฌ5ฆง]gัๅ‘‘‹ฟŒอF™ึเใs?cึี‚ˆ4k%- ] ๙ั2ž`ตvmfฝด+#ชฑGEe๔fฅ%Zทวว+CZรๅ็ฯpŠjzj๊HzEญกนW.7ตœh‚ไลT \1‚d๐๗ืh$ C#๒bจออศ0d5ฝˆะ“จ๔Rซ †/๏8ช1๙ 'ย)Mp_žg(Tฉk‡ีเซNฺศจ๖*˜๗ฟw{Imu็แฐ?ษ๏“'ฯ็?รี7RAต‰‰ฺฺึ6๑mีš:ลžิŸบ‡๊ใ_}๘่f๔๐pQP่$Kƒ^๎ผ‰k,โพๆšฯๅ์Mžs'†บ^žภcuQ ํฉ5šๆfCm%J/ำ้šถŒŠ ฃฑ—๙๙˜ฏฌะS๛RAw Hฝ*97wbขข"^ ’๎ Vซฏ:—ฮ์๋Jฏจ๋Dงทg๔๕ŒT&&PZ{;3‰˜�h0้วแอฃ๕ล˜D7ฃ:1^ฉาwืั้ฃณ#ิตตฉฉC้ลyบ๊๊อ‚joo0މ8มคŸfXBUสมƒŸ๛ม—_j4nENืDvvnn  T›4อํ/!โ„๕อ›`!>4Tอ_ญูVT๛Eqs$ๆDDSSBv�ิ˜oลฏฏ:ญ7๙ชฃ:๙ช๕:ฬWRVZ3qศ‹|`ภ—สๅ ]chGd*ฟด‰ํปยพิ*)ixุˆพ3B๕N‡Jพr๏๏๎4็Aป ซkถ’บีVU‡…xœูีR›s oYˆ๎[ฦ 8ึ$Um5‚ฐl;†$lปBQLq‡ิdTฃ:—?„๕นsฉQnมทฏฌ๎3Du>dญ?๚ชcอ„?๐ฮ\M a< ่jXก‹ซ‰๊ญฑฐฮ3š ““11 ‘ฐณw ฿ูIMอสฎจำ้†‹$(W].M– ttคU$D&จี•Pญ™ฌL„bŠZำ^f฿นzธVlม๒ŽYหd~~}}ZaฺDถNWPํ จ,) ป7vƒœัู”๓็ฑ๏ิำ/—ว๏ห‘ึV๎ุ1::คาvwงฆNdชงQฐRก:Yปท้ LCƒC ร^|wรPฎ+๎๖@ฆ<HQ๐อํ๎ขบกท๋_แเ&ชQไ๓ฯQ๙๙๗v6ก'ศ]Q ฑ้4T‡~h่๊ดSทn+z๛idRiา�ถsrาค3“๘5ฝTป*Pƒ•ฒูt„jนŠ๊๑๑ยZj่41ง‹+ฯ†že~ีUUhงฐดฉ)))"ภ+448ธm+–E47๋๔ ‘ะๅ�าึmh฿{fff฿�*TืWTLL 2ˆ†ฬLญพ๒wvVฅชญ›<—“™‰P+O˜จ.˜ฦ@MB5™ิธEฯฎ2ืีฮr ,;o‹์ฐf๙ุๅฐษ๋ฒุ\ฎ…NP&์%ยFb~ชวv%ญ6ฒฎs oศO\ป๋ Au’ะฤn;‡ฆqˆซS*Fnื”ญNŽรB:ค$ดkขำkrz๋ฅRฉฅ:V™๋zฅฒข2w๛๖ถถvธ--,,ซ๖.ญ้ํ€‡+Pล#ดXH“b: รDBmฎทwFFนR*…ผฦŽฝฬา†ฑ‰สJ๏ฝึ๏›ฅ+ฤ{€Dตๅ(•-ŠŽ]aYYOO‚ดbzšษ์H+ฉคำฺเœ6fdฤ้Lีtf0ชี3Hร^†ฏ_9นวM75T ~๛มํlm)‹ฤ€T:Pๆๅ๎๋รย€ื|pฬฝชI๔'?yๅ๚E!นŽ–{‹ อนšจฦ๒##R)๊ใW_ฏชฌถH“Xธd+ฯ–*+rฑ’ยจพœ๚zิQผtbยPูbฎoฬ†ท›rทร`ฃฆvp| ]๐w˜7 cc›Gำ*เZะดื+ใ ฐ9’“ัฎ4‡กลˆึn3ฌส††lhl3Pค™˜(ฌmูZ‚Aiš๖Omหฮฎซ๖5Kใ6ขฤ†๊9คฉ๗“r ๛Yโ,BL€ฐœˆgŸฬ{ึt5ห‰คINSบ$T/-–Š๊ิM€๊ŠธŠzงจ–.„jƒ๛จ๎ด บ]Tท8 zŽB๕j ,|ีใˆิRK@ต~ณฃ:,์y\RTตฃคvฆซญ#๔�q๔RณููHMTุฌ…45‘ิ‹ˆj3ชก’๛ซ?๙1uฉ”†‹H‘จฃ+พณe‰oŒŠ:๗ใ'ฎ“ึๆ"oพy็Nƒ]ฏ=ž8:„ฯ ^XQ]‰แกสบษ(FDฤ+9wQ š`24฿'z๔ผb†‡ญอ™\ม๚เAp|n๒Xjp22P~ืki‹ัฃฉ้›\&ญ๗X )W.^๔๔$A`‘๐Wc๖q`WฉXา=2บสKJ<<"žฬUZŒฮ๓ฒ&7ฎ!ช…Œ๊@mฮWง@ReตีฮiL,a๔!WพXQm'ชSฐ~PจฆPMกฺฏช7Vฌชรสสฬ ๗฿๙ลRธ�ซ๗๏w%ซ‰ีŠ$C1b2ษ๗a๓ู่‘ฺ1O—จK˜๓~„ฬวา.6ัต_MMPB!taึs๊๓32บื%ไฬ๒jๅฦทs๘| ŸFฃฏ&ชaH๔ŽฅฅBก๕vิใU<7ึีt:G�Bะด[šญ็‡@่ฎG์หŸƒถูด%ฏ)AFFP˜๕haKVX!#์0บ‘ม{‚\Œ!l^าhLด:Y๑Š!M,gzร่[M �บ/๎๐~5ใšกบ ภ’๘๗ฯึ ล…ƒ�jี จjฒฆf๙ฺุ0-่ญf๙, ฉ‰ูฟล%ชAQ‡โq๗,Žจ IะhหxณGjิŸ|xธ{)kไ5ษ%}ˆข๐๒ZUTใฉภX่Šฝw๏ึW5ึี๘๕ฑAS€๏โ]จ8qฯฝ๙ททo/g1b=@BB`„ะฒ Ikh้ไ–ใ`ฐ&ึ}ัBCA|‘`UQmNY•ž:ต๕ีตVีๅคช๗/"ฉ 9lD๎g yซษพjRŒž %ๆ “:ล2๏ลUšGตูGตœณ bฑ ยYค-e1ภบ็บซ๕›o"ƒuk QW „Šh1TŠัWีะำ฿๊’zMQMgณแZ‡/f0}๔<7็ra>๊oพljZ‚โิ๐ฤbRjb  i๚๙ฌุa„†ู`ฐr บšอŠ -w(cีQM/eZฺแQจ^Bฎ: เฤ๊{๚/ู๏NX“Ÿ9ไชS์ฝz$/ตณๆิ,ย,ณ๙c็ย;Š.I้_๙เฃG๙๙ห[ซ! ๒่ัnิฤ�ฌšœ$ jaฯ€แม\uTฟฺฑฆจๆrC"eขฆ๖๒ก๖L๎(๊“'?๘๒6ํฅญF Šb>wซดo๚sโ0L"Dย[้\GTฟ๊ฑvจFๅ ฉqTฟๅิ8ซ1N›EuŠ๓&จ.k‹&K๖šX$ร๒qี;mๅไ๎e?เ๛<|๔I~>จMh`เบž ศ๏ Mš>ผ9ˆkaเแœ__ซ9B‘BมูํทฒลMกzีP #ณมF$ไ2=’ธ‹wa,น;iจ!ฟ„:Msธกด๕d4U๏bE1๎Œ{]}ข€˜‘ ) ~…e‹ชWฯWPv็๓e็ฯ๏?ธฅช๗›5๕HmC5แขOฐ“Hjป็œิ๎บ๔เIxษึผRMŽ$ืดžจ†ษศๅๅ ‰&ิ”๏9๐Yปf๕ว>ไ๑ˆ^]v(์ผKVธ๓NกzีPํส…ABB59อห๋โล+ntฺ€ฺฤพัhh�?&2KXVถŽจŽสกฑiP“ิn๚ๆKื จ#tฐ๖๕%๊j Xa#1 ีk‚๊s;bNS฿HIYจ†Eส๘ุ๏"ฒ์๛Tณชํ+_\)jฌŒ๑QkŽ๊6 ีชืีž๎ฃ๚„jด64ฝ/ีaM฿|Cก๚U@5๔�)   Tkฟ›ฌถ๎(:ํืd๚ย๒a9 ่ฤ๛aฉ'_ภPํRSŠวgb:9jฺ:ฦโ ๋wnคๆ็$dปCฑ†•จ๑>rQฟ๘&ช\ƒu„?แย•ร‰V๐…•,o ีซ„jo?ฎ"šฯ%ึ•‚›i่ีวP’Zƒ59…ฆาฃฃส‘™้uDuFฦพJSpฐ—๖'GMRa{ัUแ"|ธ€gฯ๓jŠภPฮ๐ฆPฝPG5†๊.งžgจ6ƒz๑ฮzNJษใlฃ}œชSอScš^๗ปŒ‡*@u๔tQ—PVfห๔m/ศโจฦU7 0:šค(ToT{‚‚d26๑ฒ'ๆโEฌ;๕โจ‰๚ฅไP=;;ขž™.XGT๗‡Tฎ)ท75}เีศ~๗.ษpŒz>rB(ToTใช๚_ฮ=ิ  ช}ศอš์sีถฆL,{;5ห~ฎ€ำDตปLQร ?k…>4”Œฬ๊อZOT็ท5Kณ##ใใญี3ฉจ?ช๋Vึะม๚VO 'AW๓ฤ|…(8t๕P }กA}ูv ีK;ๅ˜ฑ(F 55ฯiท{๖|๙7_Z็5ๅไฤวOŒ%ญ'ช;fา##M&O‹M๖๚|ม?ธ๙ T #๚ฎ"‚aRณLผž๖จฆ3a๗hคPฝU žฝMุํ:…ตีฮ' š ฒ|le/ึIทฤ)ๆฤคตQํ–ฆำิ้;E  ิษ4!.$g฿zขบฆงwDY^M#ฌืนQ็ฮAฉน๋Z˜‡sฤœศ$ตzจฦFk ห(T/ํ”๓Cื">ัM †สืฝ>hŠฒพญฆฟนฒฒฝ‹ฟŽจ๖๋บ–-อฎฯ6"l‚dA+ธ…แ`ZฒEb]%$๐๐[-T3Kน2พษDกz…ช๚๏๚มŽิXฑ ี–ฆz ชS|Eตmฯๅ0=ภ‡<mqG๕?ฮSฃW๎โ๓8lZ[[B\VdVEก—Wุ:}=ฝา์๒๒}-FBW4l๎€ซ๓/๎ไ4ฐูึ?)#T,แห„หฎ„!ข:66J#เ๓^ช™~่› ีŒP0ซ ล„พโ11ฏปt้Auโ็_~iญy‰Š‚ฆำ‰‰c3ฦuTี] ‰‰Y€j[M:ฤ|๛ญ‹Eจ…น~]( fั`ฺ"˜—๓‘„jzT”X”™›๛ฒ8zโ;ุ๓”๗fFตYU๋_wศHFแศj\U[mิNg+ก์0ถœง๖q’ฉvHธสSฃืฅ์Q`๙vkkyv}Pฒด €ถnจVTŒฮ๎หm!๕Gไ#Wต‹จฦV` ธ๓. ‚๎ซ€j๚‰†ๆ^ฉTญ6Oฟ} แ—_ณo_Y5ssกšN‡์GˆPคฉฉแ๋.+_๖P”xjjNG{yyf&ŒgXOT™๚โโ&mรฮฑจฎปฃB๙Eแ/�ีšฐต*^n…9ีฑฅ ข`ฦ=Lฟ}Yจ.* ”mfTcชc๕DKž•ีฤEซชนำNUงอz]ํรrำŸซ๔วงnz็ศ พDตz"'”O@ำeโ>฿ฃฆa%ฦฤ๔v์3ตJอ?y๔กK#”- „n@(Hมแ,w ีฅE€๊ธธไdSAตŠ˜~Q †—ืŽtธ*-e0<=รถรทd2Q‹ํๆฺ_ดไ็้น}vภาRF˜%m‰Fs๙ัž่ฑฑLx Žฐcs/4…bณอรฮŽพš๘๘ฒ๊pฌุจจฐ0hnํ็‡&5๐๓ ุฑยงต@5“)I"ยtywŠฑI/ท‰๕‰Qฉ ช`”Iๅ:ขญCaCNEลd@มgx๛๖็ŸปฒขฒE\ކY /ƒ๑7"?ฟฃบL็ไdลIQk^€hq1™~l/#, ญE?6›ม€Vc~~ๆ)tษฑ<‹ษr�์y8ย&:๖.tXคQl`๘b,’ล'แ}ิaษขC•–๚y๚ก#zzzx{ ีฬ ชcต–ผ{xcต๓\๕ฮErีVc‡!ย" l["i?=7ŸX๒(2H‚‰j|5ตIึ3W gd{{VV\œXF่ โส ‚`}๋ว—  ŸงP„.ำ^MDuOk|กกญญค$ะฎœ6ฝๅr;gjัอ##jตอ ศษIˆ“&วม ์(‚QZjCKบืำ.Wvw›ฟKQQ{๛F(zำk2`† ๙ส5าม~343ไโธฯ๏‡™ๆ-๗Om=ีีUั8I๓ZccฤšัฝพฃCชฏฌฎhจฆs8hึq’โไไอ+ฎ45ม๘A^๋šซ๖ศ้‰OKkO€ฉณv}nปด‚ ฟฤอฐ0าๆ‰‚ว[1ชK๓kโโ†'gโโํz€�ฉsr†ะ์ฮฅำ๓๛z‡†ไ๒ยBcup_บฉีa๚ฆ ญึxŸ‹?ัXbฒไ5z;`i +[่ ๋Gิr}aแฉSQšๆ‰zJ^ัR†ตˆ:w.;\_‡อl๋oื๋๎฿‡ฺŠ๛๗ฺค๊4~ไศH]]ูๆPีˆีบF�2ฦj๒P\‹ชvุULIq˜ืeKVmDลอฒจ๊…Iํ:Q}ใQodˆDฤ ถŠ ีT7ิ.„๊dีpขQ}‚๊Ž5AuŽ๊ชŽY ีซ=fTืF84ฒv‰๊=›ี™๎ zlTฟทYPmQีชAY๐ั~ช฿ฺ๏4ฒ˜ชถ›ศล"W™“jW&ช๗๏ฟี› ํum{ืlMฐ b]ซkB!orทCsžิิO>Y|่ภ›o?x0—รตๅม…B$fฌ ีpYูnšžlkซญต_}mๅ™าZรุ˜พŠ_šบฑฑฝ]ชี4รฺVซ`„-:`ุVffqq! šžšฺ>˜ำฦอYฟž8 iCCUUM๛Œ?ooืk 124S7ซ7[ญkiฑกบ@ ๆMŠgg๕ฺ2แุX^^็่k0ษดซKฏ-€[~CมUG5\^ระnื– ผ‰๊EฝOžupฺyบ&ฆ,`##J  ล๖3 ขhะว๚ฯ]ปyZฏZhMc „ฒ  hคป"Tวj๚›ssšคŠป†ผ0ษ ึLcBoyž๖ŽฎzฝฎนYญ6ไ๎k†ษอ|ะธฒคz^ Eขqดb:ฦ๊aJืภค1�?B~[GfฒมP>cp๏'&ดฺ„ๆrน๙ูlญ4(hdคฐhSีuMM“9Y๊ไ้้ๆั๚pmggฟ>/ญ!M,7 ye^U[Y ๑W˜…Ecใ‹WU‘ๅ xคeEF†Dฺ…รŽQ^^?”@8`}Oใ*พฟv ^ู"ฉa}1wฏkป&ิ?5"ยหI‘o๊?~u|qT๕ี\†ภึƒ’สQ(ภฯบbTgต› Œ==ŽจฮVI++aUO%)าำี๕y:ฃP=คืโจNmkMO//์ฤP=1žNBตJUQ™8ˆกบ<]YRุักอKไJฦวซชโ›ณๅJ|bนี<กpRˆPฝฏL48X\lบฏธ6†Pญอ+จ>ล0จ๖๖` ~Ž ป^7ožtaŸ�๋Gำณศƒแข)`=—#G เ •‡6IัFE๓ีP s๓ฆัhC5‹*aŒขบฉฟนณ““ จถ{  z|ผฑ1ซข8ฏ `b P‘!—๊๖5๗VT๐xcง•%`ภแjšว‡มํˆุ1a–ีžฎF–He^Eมไุ˜v*!ฃ=<ผณธŸง—H23ัE›ชฎฉ†ผน<นฅฅyvศ†๊ๆ๔๔ฺฺ$™8ยจjฌี๑Y๑UNPo‰ศxT๛‘…c~YFฤวƒ 4.-+หzุดด๏]’๚}ญฃพ{HP4_ศใ0<ˆอล[B๋าฬŒ์้ๅLSม\{ gAฐ ๓‡็xV6@g4ก0Zมฃ๙ญี@ืฌดjฯพ>˜JV2ฑ=ญ๕ลบ๓ฆููผผฏ่๑qฮฌช9œ ค3ชO”BVGฉTฉ LฟๆfุJOถ ฺฏญM.รUuC_ถ ดJฟบ8M”™ูุ(ihOWโปGช๗ 'f'ๆๆfd@6e`฿๘ธ\^ู’5X_R2;›\ฌOK“Js;ห6ชกJƒ'†กท„vz^‚‹ฏ'Gร^ภฃงY`›อฆ……ญ็r„-ใะPg Ÿฎฝฯซ†A{ฃPถใOผศ‹Ž‰<–1aหŠุ๊5ฝำำ^Eั า†ฬฬฺnIO{8แฑqicaM ขซ‰S#‚จ‡๋ฟJoo??˜œ ซชฆ5z}BยLฎ๋•/‹ 1;�ี ชแใ*ญฟ\ฅ:พZฝถB €๕hฒช๊๎ส๖vƒ_ำ›™œ›~mDฅํ๎žี้�ี:]\\Z!LะปแUต%a จ6` *qTี)t€m$`ฎBBฝhHlฏPDEFfgง)™๐\j๊~€5Lุ’๐E<A0๛ฅ๕v๑๗~่๘bจFฃn‰ำghAtˆ(˜ฑBT'ฆ œฺžŸ_Xawัู:W_\1==:*/ž)ปˆrๅ]RmEYš6^Žฃบด(gฐ>.Nจ6–Futฤ้’ำGฌจ๎๋3ฃบฑฑ็ฝ๚p๙NH‰„ว วgf–”๓;าอim ี๑A๕*8Ezz’ๅ‰I๐ นผถ3ํ๔Pmํl—บX>JบีL&ถUฬฐeำ<yืฏฤHฝ แ แiSS”ว&ˆ(Mำ\ ี�๋๋ืถ์ †Mlgฌี'Nิดg{ถH—e7ฆจฏ!=ฝฒฎแฝŽm๒ฮฮกqiIej*|เ—ดle‚eC6”)ํฦF™ทอต็้งง๛@ศ•สไไŠBNาจ`ืรcึŠjmyo9\หตดI๕P^๋ป*ืขช“k เlไ75gŽภuๅเˆ<นคคซKW฿จึj“3“ตฤฆoU ฌFฐฯ*๙ W[b๊ง <h:ฝLC Š ศ/9dศศดด๘:"๖=A]]๓ลโ โ‹[ฃอ่"1Oภ eo“ƒF]ั‡ ๅซ฿Dฮkจ0Ÿ๋๑๕ต^ur8ฒh‘x9}›ฌจ>ฃฺ;55-m  “ ึรแจ†อšผโ™๛|HY๋๋๋aUฃ >+ช5}อส๚ด4นชฐs@S31‘VจL))มก_ฺื—™)ญŽภ#8ชฯ๗๔จร+L๛††tบxEvz2ีqiJuEงฉญMฉŽ‹OTซ!yX™}zจฎฉjibยปqน3ลVีP๖5H2z‰#0ื“/ˆj๐่}๓FC จำhพ๙ๆ๓“A๕{`ฺขุV ƒ.๒เ:ƒํฝ"UPฝฝ4ง#พฅ{,6‰๕ๅQ}š€๊าฌฌ‘ti :66gถ\~(yงึ้ฒณฅบส๛ี๘ๆอ?ดฉibLZUY]6;ซอ“–K๓๒ฆง{ป๊ตบคค๑qฝีูแ๊ Z][)ึdŒ  ๕CCJecใุXEใ BuEE๖DฝV_Pภชฺ๙I,รฤ ๎๎ใ๘ถ๚ฯ/u่)<)ฦ^7EPaม็ ฎ%ๆฐ_ถวฤgแ žIr( ใแวโ ๙ั๓นX<˜›kภ^ œๆ„ยลช฿†>A`:ฬc-�G๖๊‚ŸIƒdห๐ณฺซ๊SฅฅนuF4ณ‹i1kฯ๕ช๏cชบ๒พจซ ถึ3•:า;VT็Œ–k๕ฝฝrUE]RN†Z8“ฎnl<€]tBน:2๘ษๅฝ&จ๊Š๓&tฐdฅ:\mEuxธ\ฎฏช=UŸ?”ฉฬ–jตqษแษ็ฯฯฮ*๓ 1ผมมช*ำ๊`๔$ตเ]ผ๎ขH๑ไท฿h›&ขข>๘ภ้hH๋G”-ๅ7OBƒ`,.ce ฌ้i0 ๕7ืึž:ER[ฬฮ}9*•ีใTช‹ฺฺ’“ๅ*]g็ฝ'N๔f7–8ะืVฏR๖๖‚28?mu‘€ใT^ัB๗่๏—หมน{”9rธhKOŸฒฉjXŒyy-ฅpอจำ%gfgฅMM๑ฝ6ฉ/#=ฝฎN1ื^ฌm™fnUmF๕/-มœ`๘ๆฤุ=๕ห/œ`‡^�7Pภ?š‚ยร$ ›ๆFX^ฤๅ๐BB ?R สT๓ํพนจ?xะฺสล_ส`o|9“'‹]|*ฬy๋ๆ�Bศ‚+ุV,*TWŸ‚5[Y‡UC�ีpฌอูTuๅaดg>2ขิ‘U5†๊„@ueRlษงลืงC๚ิฉฝX‚1d$Y™,‡์uOฆช[[ีล…ำฆŽŽไdฅTญ"ฃZ[eจรP-•N้ณuษแส ˆj|By4‡C#ิพฝน่$E4B๑f๓ šF๛ๆ›ล7IQ ไ๖n/๋ๆ 6Zกq๗’/๒lจŽลrี[›Z3 †2ไ‡กyเ™ ีจUอใT Ÿ๓u€j๐3ชkชณชม%bA5ชมŠjnVช ๋Z˜เ๋หKJฮƒ=ส†ึ๖ไdฉ4= ชUVTฃ‹ษduvdšV{๚ta7P Ž่ึ๖buKห†UีำำŽ<žfcแี?Ÿgวnฬ Œzฃ`2ฝแ ธล๔fZYŸŒeL3ส?ฐa๔ส฿y!ดฝyรdcฏวhฟ)ฮิ๗~\ผำฒW๛F๐าุbd“VเซFw$ตQ‘VdB ฐ8แe‹ุถโtห(l+F6EชTuuญๅ*%๒ืYQ5ฒ93|›V‡UจUแแyy๗๏c>พผ<รดคk"/๏bถญˆฃบ�ŠwEŠ H€Xทรร3Gดฺยฒฒาา‰Ayธบคคตu$ผธX_] ซZC™`l ก๚ภ@ตŸŸ,๖จ k ี‹)๎ู๓ํท_jุ›*h4˜บธจส‡‰ <ž"DธไพM_5Zi/ฉ้๏‡ญปดธ์ดฮN๓ถ"8/บsชฯŸ„mEC~>ถญˆ~€ฅฅ]ƒสชF:น๒tฌะ1ฟฏํYŸ๋ ืีว?_แ�้pใfฉ์$%sฝ€nา`ฑP"ฑn+Ž…ซิ๊โโ–ฒุšูฎ๐pํิLˆ้๐๐ฺฮษs˜ชNยP}~รชjงจ๖ภฒ ็ zฺึล ๛฿ฯƒใ้ๅ้้แตไO^๔p b„vq๚o!J/ศตที๏ูพฟ…j7Qg๊Q3ชปDต‚๊ไ…PญลQน<T๋qT๋)Tฟ๚จฎด บbๅจ๎>wฮี๒Q=>Res€�ชๅ ข4‹dcซ๊ฐฒฒŸ…?lฎป›žถ{ๆ—๓N&Zxลฤ`_2ช<xะมLHณีธโน/,jC่“SS=6YDนฌ…9เ‹œ†m3๚6y,u‚น ีฑฑmmA‰3eeL&#˜'Š./ol4Vใ5„}ๅ#สŠ8dตNAป4ส<๔4q[‘ร๐เ2SU‘k‚Š"ศJ•ฃ\ตทท$2ฉe�•ภ`Šเซft ด_=lวT–70!!ป^ฉลfVฬ ‘ส1วUGืHธันก๔ผ)H{รถ"†๊มขชพBjฉyzฝพhฎ�ูฉooŽ Eปยลลka๖์นr๓. ฮำฅฝ๐๐ขY:=๙ๅ7%$@q,บu๐x‘YiP„X€7ชiBฉด�๕PU+ะOJ_;ฃQซฑฌ,Hš•ิา้(๏ก๋-•ฺ k}yyržกภ˜““›หk‚ G•JW‘?cJ‚ƒiณหมU„l9Y ่`†:ฃีb(ฏh4U ๆ@D€.m]ภูชๆv?3)ฆฯใ<ป_`๗ฬฯN*ฏ–jšีญ>๏ข[ ์ภ™5๕,šz“ม๚ฝ๗ญ…y๓๘˜anm*GF.นJŒXXž฿™f0ั$ช&gb|8S๓GF๔JไeŒฃ\u2๒UP-6ฐu _5–SLํ8 fฝ'"ใsMีซฮTWUล„๕Ž i“แ€ฐ๏ีึษจ\ืๆซพ˜ E2gAฉฉ๕้๊ฉB&ำชช7 ช…B‰B์e๓ฉ๙๛CใำE+_ภฅท Iํu๛ƒEka๖œผr="†p^ย พx๙จfiสหsMฦะc)5ตนPฏzฉfb"Y ้emีฉSฃ๕h'Pข˜หณณกHผถ›No๋ฉW้PnบดUิช‡†ดy†๛ออƒจฆ=3ฝธX*‹Kฌฌ์๊ยrีลลี O๊แล•็หฌพ๊สŸฝ7 j๊n'2cg๎†,รภbL&ฝ'i !+ฦ„ญ รพ‰l"[$ฒ#ฒ EQ".m)ึ๊๔ถฅvDGpŠ8ฮธเR˜ถทOz?๚>๘ๆ๗๐{๚ฟ> 9<' ‹ ษ็๎๗+““ๅ|ฮ๋\็๚ผฏ๗UyๆLaavงน'$Šำีึš,ถˆชีyWVผผe—•ญy่้ำภMD5ฌ! xl6พ#ฉฐ๙แKGฎ‡gf฿NไnGTSภมฺ‘)*4ฦ}๔จ: ็Kฃธ\๕ฃบภ�q๙ไ$E25hี{{ญ‹w ™๎JE)‘์ฅี]]่วธb‹เ]weyœัmŒสพb™็ฺฑุ์์ d๊ดพ\T›jŒ‚fซมLSƒํกฒr(ฅบUBลUf[ญ= I้้ใ˜บ5ถข๊ฌคXy\IIAA๊˜ฑzzโ*ฒรฺฺŠ‹Kึปฌ่็ทYจฆม๕๐ล`ช/Ÿgุม’"T‹€JOณ QM „Z˜แแp‡พMทoใ…dึun…›๋{Yม๛–ํ๏hฅ™L I‹็ hตั0zญหŠด ะ %่�ณGVทŒF˜?qใeXV1ฮhœD‰น๎๎ิจbK@iVRฺฆธธ๏ขคU*นfAyฆ\ฦM๖๖&%มฌDs3/ผyิฉึY'ใฬํ๖ฎฎฒฐn“\Žlk๔mm%Uš\Sff{ปธฅ!สธnฑIงo-ช)ม{๗๎ฝธ๗"Wu1oฏฦƒ๗ร_ะซ`3ยฒซuฃ4iZ{ณI๖๐ฅใ๔ว สvSogฅ@?žล•ฎ2l ๅJฃฏิ*DFบก“:œฑๅ™QH$…ใPcจVฉโใซภ๔ฟิ`ะjำา๚ฌFพ?g+�มŸ,myž3Jซตผ’๐ฦั”„าhีี<AZ@U์ก€ƒvVVลอะ๋ัใ6&Šลฏ๚"fRฤ์…. ห3hฆ$E#(ฉซซฒK˜ม"Qooูzuีt๚fกš(‘๐นธK5p?๔Rt”�ํ‡~;ฦิึ้e†fŽR ซ{- ู ต*,ฬฝ}*eฅX|5ดฃขภฃธผข"๛)๎าZ%…,>ญอ3ฺv–"-ญค„y�เž••aๅVะ ฅ๕U-ฯDฝLภ๖“ฉท—ฃ็ i๐?�ึfJK๐ o|,N ชั†yy๛–ญ,~ีyfs<Lj ฬิ’ผเH“);6†฿๓๒„znZ|Yู:ˆLk‹Qm…2๘ k›ื”ม%˜ค@vจ_`(bแ๕ฺเš9ฬTฟ~๖m๎๖E๕ิ์๋!G+‹/šณV,จR…BซฅปgฑGรyึL‡ษRฏ—€์์ฃ+‘ซฟ†#๕๕1แ/ฅH40PRhฤฑq[a-4๎เ๓ƒช˜ึcล‰๓๒.\ภDP :ธž(D}ใฅฅBด‡`0๒` ๕๕…V-—ค•๊…/ฒซน}ใ๛๖้๕xHทL’ ปอfn_"๑๑๑เu‘ดน>>v฿ฯฦP&ˆ1ต28ะ/ สษณแPค8ฝTzkX e‹.D€๊๛๗รยpTำ…"s/[อ„…{Tg ิqัศHbrฒoลPjธ&@ ๚Kdคพš;0� , ล†‰กPŒ—Xฎโw�ซฒดฝภะ˜LA0วัิฒ0‘E_hPi)8;มกศb]h[wfŒฅ\ลxY™^?0Z\�35…}€_ุศะˆDee,g@Œโuฅ?˜v๗[ˆjสๅsฌีtบVอใเaLฐฯอ‡/ษ3ๆ็ ”ํ;๖๎…sŸ๏๐แG:๐ถธิ๛ีj๎~๗๎โ™kเ๎๏๏ศุ‘ฃi๛๖มฅi“PŒŠeรl‹มมใทฆŽ O›อx6‚7ษ’#STH๏ ุi[0Tq๏^Cš?ตฆฎGื›์๚ุว^฿@ป๏g+QฝแEตห)gจ6yQํE๕วƒ๊@/ชฝจ†พภ<lEงซ8/†,)อฮRฉ”m>ฆfมฬ@ฒชํ>$ค@T˜[งๆ๋ใ็็็ใรฯ/ `ี„�ชƒร jึพLัGtมงแŠ  l/Q’ynฺ‘ w๘ƒ;˜:7“H0ฬ-+“เำMF_ sU:ฤ‹๊mŽ๊W^ToTบฃQMqŠ๊^T{Qฝ›AงK$\ฎx เ<|8ไˆbณS”m? ฏ_g8๊`~3hๅฑู2ˆํžQŽฅŽŸ ‹[ม๊uฌ๕ฃš|"Y+†z฿a‡๒๐ฅ้9ฝf›ฯล` knqฺมย)๊`พbฮK*2™ฏ[น4šล]ย#&#๔ะ]Eฟƒj&› ้๛R฿ ์ั#G1๕๋Wอ๖G5Uฃ™™q๐1มbฯฎ๔€N—Ix˜ ah2™S๋G5ฆา*๖Zค๗บ4-.š);`ฬ-,:๘˜วŽ=~ŒญTeYP๏๚้!“qญt็ š"iต[็”`ชะ”๕9น๑Gฦ์ซท;ีเA‰บย&ฏY|”eย‘มb‰ *ƒห`์๖W.๋E5“ยhน+ฎพ~ท๏? 7-๕;ีะยู๋3โ๊n๙แ)G ภค‰ๆšto‡ š†ŒE๛q7@,๋ฆƒŠ๒ŒŒ๙ฉ\สฮน3ไ)๙ŒŒ็=Iธ~R%ฦdzg–ขš%Iดา๓ ฐ๛†$ช—–๔ูฤz๛�๒jๆรwc๘MีืŠ„0–wขyชLฐ+‹lH ๔ญพ๙ะABจ}™0์T็ฮฮ ‘ืc>๘ะฎ…)ฦใj ล;๓ทีA‘@Fงใยฐ๛w†ษํœฯMO๋ฉ;c2Rอ‹!e๕๐๐ใงAj` ฤWb)ๆjžƒjJWญ๖๓ร็{ง๙ๅs‚ใ๙๙S[ๅี*ฬ‡žฟฤ0ปuwˆ๗8๏ฬ฿BTำh|H3ญTอพ}‡<…{lx๛ึ“ฐZฏ๖์˜ƒศใว+Vต”ฉธ›</ช=ีoฝจ๖ข๚c‘่YP},ŽีžŒjƒดQ๘๓YฌฌคGไ้Œ™™ฑขh'y;;ใภbฏงวผาฺd2ร{ำนeจFUณŠ›jjh่ƒ;็4X˜ฃ์จ17๗Œ<rnxi|฿T*E’$oไเEตี^T{QํEตี ช‘6JfืQ (่ๆฃ็คฝ3^ฯฯSvุ˜z๛Š๔าt8ใๅKS(.‘‚X{x'ึ šF‹eฑอŠชfo฿&/โ~ถh6๏ฌษจืO/s`๒๘ฑเ\ฤƒ\‘W=๊)จฆฒ kืQ 4ิMuFฦฬิิNCตaโ-น4Œซ›ฑถMก–DฒฟWอบeจŸ&-wEพๆ๗๘ฑwะgK ;l.SงŸ9tCตW‚ล<ฯ›ญ๖TKู" —ฑBi๗ั๓!๒2ลู†jM๎ิฬŒใ๊›&^#…v0ๆี๋m ชก๙‹ ฑ๑ฐ#›๊๐๐้ลน6ฉิน…%ฒeTฐๅ~๐ภN��๊Q•ŒJ๕ๆใ<ี4บ2+V& 5)้9yQศ๋W;.aQWฟzๅ เ็QฯJษ"EŠ๛R๏ษฑ%จfPฉ‰xๅ&ฦ'Œ{็yๆ๖ุ)S\ฃ1/’;ž@mfI .‘B•P่อ€l5ช๗จf0�ี2Žj๋ๆอ็d™ร‡gชฉTฉTฐKฤจT|iP:˜“Z์ชถฐWกZ่]XTณX€jŽŸํ�„ชI3ี็ฮ-@฿[8ˆBกO •ค)า๖นทำ "๔๑ั๋ :|xx|/สขK๙H^zQฝ๕จกQMฃPxhู๖ไภฐฐ—/ษำCฏPฮฮุrc๑ค]ฮl{ฆจ Yญญๅๅ™™“%กนน,๖^<Š_Tม{LYศ šFแCk>๖Š/v๛ฑฃ้i3่wชฺส3ำKถ;ชณ’บะd,. v`ฑ๘1g%JยPไเ๏ ผจ~วPฯ‹j/ชฝจ:T9A๕ง^TTƒ๕๘1\G5รxJ›rฟฌฌ!๒L๕์ซ)คฉๆp„lูศX^6?9ะฝณษ”jŒ๐กR็็Iน3†^&™p/+ ผธB๏๔฿tT3`ฦ็ใšjŸ8๐o6›๕6 ‡†67G็gowTณXR!ทซ+;;(˜ež#ทุ ฟsGดาc@ˆq:ล›ูrToล)โชน\ฑฺ-š!T“iชฯฮ[„zaa,์ฬศถG5ัq๑e>จพ5yถ๚eRŽj*D |ถw๚o>ช™R•Šหฅใจx์�ีรรfณก:(จณ9ตพ2xฬFNO šขั;@๕งw๎ถ๚ชฅT/ชw8ชก&๔็แฺจ@๓CrKฝกกe๏ำ๊j•$:*ฎฌlœ ๑ูใฐh811๓št5๕๙ร›>xG\๐^P๐ผถี›jgUŸฎะ๑๛รค–z`จงัP!bNJjk›ฬ๎จึW›ขฃ-๚dฑ๗)๙j๊ใพP<—ฒ+๔฿๑จฆศd"žฉ๖ จ~๔ˆTต๖๚๕”AcDSห๙ล;@ีึ6ะj]€wเ†๚โัC` ^x�jVพ}`“QM•Bร@:G๕x฿ƒsคRˆs‹‹–›นซ –Kถ\4ทd[W€๔ssz <ภ์’xื+๔฿๑จ๖‡ผ+_ŒW*๚†vพ|IŠูู๊)ซ๛GnฎLm„จzป;širscc๛BฌจžŸ}Mฺๆ๙ฃP<ก@~_ล๗ฺVo:ช-7๓v-Eทึ‚{ถ`-TคBฮฎ+uฒฒw๛ท0%%M./ึkฬๆs็HE ๗ฏุVS้Z-Ÿ๏ํ0ฐรQอd Q๗[<๑4โฉ๗้yรŠ$9ุ๋w฿m๗ฐฺู™ŸKฆฆfษฤีCฯํlr„B…@!ฅ{O€ME5f๑ยฒ[f{|™ยโ}บฒเะ’š>นo๒4šคฑ6,ƒล๋ฅ%RํหทWฤX"(Œz5 ;ีt!=ฑ}m ใ’ข๚pFฦท†ๅ๋8](LปreปฃบบนนธG๕ฤิ,YžPอ_ฑP–JE0sํpะ<fฌi=๊.ช ึMV}| ๚ณeT[๊˜:;ใvชหSKJ๐ลkrT‡ช}|ํP-ำฒ4๏dtะ–yฃš%^-c5๕€๛)qd งี’ิ44ฤฦF้ไyy–S46fWฅ )+ร‡3^<|h็h&–๑Dbืฮฝพž1จkฆ›ปจf๚‹P๗[เXOIPฝโ}ชฯ5ลฦŽŒฤีdowTทtJ๒ํe,ssรแdF ร๗ว๑|๚แบ*๔g2=d6๏exQฝƒPM5ญA๕[/ชทช?จžZj/ชฝจ^ั8"ผโ ่&yŸ.ฐฉฦQฅืณ1‡ณืq่พŠeIผ%um๊ะP|SŽXคโ9—๋1>>,V G ฿๛Œ๋Gu@B"ณkT๎ภจ๚๐ดYoปlj8 ๐ AAvŒซŸ#ฉ-‡ฮ]ท๑ำN— D˜๓|รืืว‡E๕€ฉ6็๐Yํ๘ทํQอึส๘|ผโ ฬช‡พ]‰FฉtฉŸ]ทํVจํH<1EŽ๊็ฯCC๑ธร…ฆฺฮ}‚™ฬ€ �๔;�ชรย˜LฺPอๆIV•S‚ีdFี็†Wa้D*emธพD๛ฐะ=l˜4[m‡jKๅณฮQอDฤ๑ˆษจ๖ณ”‚๏T3)บใdญT<|Nบจh฿Q�ๆ w�ชัฐ๛Aฐญ๗ฑm,ฤภัŒลr’`ข๚๘yศนฐ๖๓ dฌีศ{Yท |x˜,Xป๋-k๚ษHuิcเฮวxM•ชเ)Dฮ๚vั{7พž2Y>พvฑิ6G5ล—+Pู‡a}ศ์?2^ฯ์ผŽD๗ Sฏ_“–ี๗๕แพฏ,ฉุŸ`š%ˆกxศ€d~ปฐฺ=TำhPสใใ;๓๕ฝŸฌ%|i็u s ำค@๎ีd๑มrž๋ไlg0ฉvฯุ๙ƒๅ็kW๚ฐอQM/h…B|Q‘+"ํ~;43k0xภ๑ี@;า๊r…BˆฃšฮUษ8gจ bQ=็ไ�ฑgุบQอ`ˆx …฿W@ภƒ็<จ๙ !ช็H ๖ฮy†oศ๓Tb'K' ฐ๐๑ TSัฤNA5ึฦd+ฒ†ภๆ‡คogvf๓—w๔ ๕|๘ะธbฯษƒYgจ ๓ RSืบQํ๏ึฦV,JJ†‡9่(เดั,ึ;wวพ& าŠภ`'๗ะt‡g๚v(ชฉ^T{QํEตี^T“๘Uฑ9BŠ{G54UDโ`ƒ6*ฯศ˜ศ๕รk0ผฮ น^ฝ|ูig>ษ N,7€๊๊๋ืoจi/๑TำคR•€+ล๕๛Ž‘้?––ๆ<:sำคู๊แ๖‘Jฑท ี-อ#ง"Ž๑ขฺ‹j/ช‰P}ื‹j2T›ฝจFจ๖}ฏจฎ๑pT3P๘'7Š๘๏ีLพ€‡แfŠ”’’—/H„jฏgๆ=bQ ^จC/šน๘Rƒ ;w฿ุช๓Ÿ?จฏ๕TC7"ญŠ‹K๕จุใวค-ซ๔2ม uิฐ๊}__<'–)œ”ฯn�ีอฃฟœชฏ๗xTหๅ1Jy<๏ฝฃฺŸ"ุ5UคŒฟ$“๊อฬฬk4“โš%C๕ะMŠฅ;Pํค๛ฦ†P}๏ฤ‰๚ฺFA5t#RavM๏฿'ณŸ›๓T›็HQเฯ ชy<หP}๓าต&G5“ฉำลDศU๋B5ceธjPอโL$zN†ูู๊ทžCjสซืdy ‡YีT[฿.!์SคฎฃZฃฏF๓ย(ฆ.๕ไคP˜ี Ž›„ผsVjj||jj๔$ฯวGฃR[กบทฺ”š;฿็๋ซื'%EวยFกกพิ๊ฌคุุดด่ิดฦ€j&8y๒8ถoห7ภ๔เ1ฃย››๓˜ูฌŸ#ฑญ?v็^> —6‘Bหsีh–IŠำaNล๑ยฐ,˜‚ฉqi}ใtzC—dRาฅŽ‹/  ๊ัญฟ#Tร„)›:9Dgqะqq๑}ใTjuต�ฆetW<๔Uฦmช•{tiฒuลฯฬฝึฑบ ื5Tำ-ฆห+– II/ศ’ดฏๆง<‡ิะdqๆ0‰ฒ๚ัMฎAฑว T๋ป“.]JO็jบ;š’‚aญ#ษOžคค๔๖™:ž$ฆง'&ฦคไ‡†๊๕#ƒฟŽPŸีu้RศžยŠษฒ�ณนž“าื'ิd]๏x๒D.ON,ฌฉจฆ๙หเoqแz๛ฮ2้ร9ฝƒ” ๆgฯยIป‡ววqsไt uxพฏFตมะ:2˜“^VึัS”?>ะึ–˜QTX™อfŸน4XจฝTT”[‚ฺม‡„$'ŸBจฎฎ๎8s้IHJJ_I˜ิึ ฯˆจจ›ฌฮฮDeNฬ่haa_™ีD๋‚l6Wll6ำmT ู ศfนLฅ๖๔ขzํ„กzjj†Xณจ~ุb‹จ,!ดlu(i ชsี—/‹๔mฟ'ฆคdeŒ&Gภd/ฎTuถžzRX˜|IY$olliน”ฌLดขz๒ผๅ„ˆIฉฐ<0šกŒˆ).ๆšFฮ„„ศๅONฅ9ฝQ ใดZฟล p€๊gฯ< ีdถี€jฑุฯ๖Mp0‘DหpdZฝ6ชnป—|5%/๏=ๅี พjdอณ„Š ป๔`๗ฬ่ปล•ๆฌ‘ีออg.%&*#"*ณ๙ๆค‘3่…ลAA็ฯ'?Q&$;eพ^Tฟ;ฝaERฎณŒ่่�šปจ† '-๎–– ฃ:#c*ืเAจ†…EโขMh\จู๏ร@Gสjบจึ'๖?Jบฯ\kบ|ผฃใษˆฬŸ~บzตๆ™kืŠŠฮœi๚ฦ‘#๙Oำ‰ป…1ฟzโD๚้บ฿~ฟzu๙๋w›”๒d๔Œิๆัk'sŠ๓ไ็W๋kv�ชYจA ~‹6๘‰้น้%’๋ง์ุo๛.่BพD@ฅา\ฯU_ฟ๗๛‰฿}๗๋ฏwฏ๊z:šš ?๕ว๘๘_j๚ฑจต๎ฺตซ9QIฟ’““<z๊๓“๕ว๏y๗FDyๅrl๓Xำฉยย฿k๚ใjo๏oฟ5จlํๅ—ซWณฝจzT?|ไEต๕ ี‡7ีj ช/฿[ƒ๊ซEg๎9F๕ฎ[QdCuฮจGขzฺ‹๊M@uŽ๊$จe ช๋ผgE๕5/ชtุyีryฤหˆŠbปj$qฉ^`h่๓็ฤย‡ร33นคฐ,,’๕ร}๑แŠf†%ซBw  ภ;qขฟํษ็7jksอญ#ษ‰ฟ๒ใu ืเLhž๚๓ว๖฿?6๒ะฆซn๎M$<Po6ทŽ &?Aฯฝ‡๖q๚ๆอS;ีp !๎๑ศฝ}ŸิTonฮฃj๎จะ—L`๘1วฯวqZ‡ฆ4kฃ๊ธCVใ—_RŽW๊AฦŸœไงฆ๚ำซ้ำO๐ฯเฝั'NŸNฒ*@PฎRpืฎธZ&บy‘S'Oศฯๅ—ขหล†$vxQํีฦMAu†ีึ ศVกบีfชoฌA๕!DAจพ๗ชซื บvงข:X์ีž4ƒ5ไจ฿ช;-จฎ๘ๅ—หdจพjEu%Ž๊๎ึ5จี‚๊8ี7<ี4‡mi|๑๐n,ชf2‘ๅพไ– /^/*fฬฮzR๚ทฏfศ”ีฤ๘ๅอา( ๓gบŽj}s๓ตkOoqตคไฯ?Ÿ4…$ฤผ‹๊฿~ณDี๗€๊้ลฟ~๗n๒hzเฝS๐ŒˆŸ~๚๑ช฿๎TS0ฎJ%dแ*แ๗ษคzแKfณgMFฝf๘ษe๋}ฬgฅhHฦใ๓@ตน{ไงS!!ืฎUิJฮC$&ๆษฏี5vQuLBuฅีว น๊=บA˜ฒW3ปFNR*P]l‰ช'=;ชf0ฤ’hฃeฤล+ ฺจฺ฿_ จฦ—}ฦว‡†HP๊•วกz~–ฌq๙#>สfCO;G–�๏ บฅๅ—_Nบ๑cQYู )i]D"๏ ฺU฿ƒจบฐE7FฯXP฿ž<ฑว‚๊USน€j:ีT[า๋=l6RŸ‘ก๚มฎช๘‡ญE5ˆBaI๑๎็Ÿ็ทซ๓็ตk99ซ^U'#TŸฎlฐ :ื฿Nqทฎกบฟใาต99^Ty๘ฦญ ‡Q’ดอŒชiมมZŸ#ล?T__‰T/c~^ใa'วิYน^ฦห,Nกตuีฌ๎๎Ÿ~๚ๅไซ9ี'OEQ๕ฺ\๕Ÿ6‘S๛฿ฎ ztช›๘ฑฎอR“�+;ี|‘VKว-|o? UUO{ช)ฯศ,<๘โƒZ30]GตF฿๖ฏMMQุ�จFเumฎZwผำำวP "Nqฃ๐—kหจ.*๚W„๊bดiบถ๕'^Vd0ำไ Vวใ63ชฆ๙๙ูนใPฉB…‚ดฉโิ”งก:wโY…—IYx=ฎˆ…TืQMี๋๛ํฺ็7.ืZขj”ซnZƒjค�i* ๙้'ี‰—Pฎบะ‚๊ศU๑‡Q•หษซWฺฮ@5ˆi |Q1 ่1™ชz๘ูข‡9yB๋๒้%'ิ;wn‡โ]„bพV๋ช)”ž{๓ฬ๖IบnQ‹.็ชZ‰ชๅHr๕๊“฿›>Tฃจ๚ฦ`๒ตeTŸ,*๚ก๚t qw0dL^T;Cต๛Q๕ซPอๆ๑ศQ=แiจ6ธŠjญ@ฬvี'O\=^Oฅ๙฿S'๗ ‚J๚ฦฬ†_ F๎œJ<qฃ๘๕๋ON-Š๘๕ื?H/D'ฬฅัSืฌแ๖ษ„D๔ŒXY?h๖๎^บดsP-ญB5Iืแ%ฯC5ezšีรwnc๛m[ีฃJๅช›ๆ@W฿ฌ๋๗Nž„ฬ๓ฏ ึCQ๕žœ  zฯีจๆ6๘gObโฉM้้]qท?มป๎๚่ษ&ˆชo๚ใฦ้ำh%<ฤ‹๊-Šช9ญ€Kว]ๆ‡ษ๚฿พึxฉQถ๚5‰eำ‹G๑ถGจS4“บcืไ฿ำS—฿ถญ#™ฦถ6น<Z‘ฺ_WYู=ั:UYฉั4\/ืษฃฃuบ์FERืเ`๔d๙Hf~qu๕˜๕:]o‰ฉูบj[ฅ‹๑ฏ*t>™ฃา๔‚็Mฦ……gฤ™๛แsp0:ฦUซ)47P]าP\ ๎4mm้๒8AฌN?6•Ÿฆ1Œ๓ใ}9IIบ~c\๙HyvvKKyf~~GGzz<[ัึ*—ซ๐—์lP3ีeF๕{tฎz๋ขj/ช?ช)ไจฮถข๚ด;จพทcQ}ฬ‹j;T“ดn?7ผ!T›ํQ เ%AuZTทฺP]hEuฏ9ื‹๊-‹ชืxNฒบ="Iผžy๗;P(t1 ™™ฉฉi*‘cฑv ชgHไz/^>ย๛>Sฉ M็ณBต†.ๅ์๗๕ตT;ฒ…AARiX˜”%eณ‘ฅž”ฝ]XR!ศาhะCRaP�tK …๐x†P฿06…๎?Sฺทฝณƒษh1 ชJฦ}L/ฬyช็ๆ–ˆฟcว๎฿ฦ‚—ญYlŽZM๗gธŽjh1ฯแ๘ •j™‡t˜sพพBแ�๘ณษข (”J…BิUVส†y(•๙PYh‚าญฯ8พ\^w ว๗{QฝฉQ5C,–iqT๚’ข:c†�ี<^BˆRง3ีฃำ=ี<…ˆ๓z+j๔ #uQQฟฺ๔Gแ@ต?&PญFuธี. :<ีAี7Pฝiใ๙(@๕%จูช๖ขกšน7Œkๆหdl(ชถุ>“oXหห—„๒ดรCณฏ0LฅKˆ€WˆPฦ$ศๅฦุh‰€วใrูa~;ag๊ี,ฑทะ๓Gœ•v "ะGa�ี,V8ฅ&&สำ+๓‚ถ;ชฉ€j6WU๓ศQํi0h่อKฤ กcแ๗sqซGถDยฆ3฿?ชฉ7{๊“z{ƒ>RPTŠe๑h๐x์ฝฬDีL$ยฤ‘ใว๎|อส‰X๚ช้t>/U—ะิt“'๏Uฦ่2หฃฃe2.&จ~E†๊—vMฮ๘pมใ~�TSYYืวภ฿:fฒทไc๚บื‡j Eซ„Bีท๏„‡ม:<|ั๓Tี่ย<M„j๔=xlย›œฑ„ ‡ผืลFีเŽšœioผ-วฃz˜ฤZปวgQ7U3‘/+—ršช *พš'š;W–ซำ…์9ีิt๒ไษฆSw!พ”หฃ พV ภๆ‹นG(dฑถ%ธs็ษPโ%ฏWคpE<™cTร้ฑƒล2%5”—ผqhปAhฦ:QM_๊๏„“ไf๕ธฦMีLŸ#Žชฟํ๋k‡jL่ีฌญ™T“ฉซผ<ส˜ํใ๓MFj`@ภC5—/ Aฟ)•ถtCQ๕*'๗0n38€ฃz-้ Brๅ““'?ท b75Šˆ€DvชZฅๅ๓ูยmน่˜๛vž8!”1๔dZษqeํ@gเทUํูวว๏ฃŽ:PMŠ*ฉG๕ใ๛wˆ๓็ฮ-xžชลg็ˆsีw<๖๓ณกZ m‰ศ{]P|}๖๏๗๓ค๐1ขฺจšๆฏํฦrYypฐี$p฿’ฃšอึชข•ง,y�๕5 ชี{๖$$ศฃ  ผŠ‚kG*ฅำ—ฏ้ีYY๘‡�TK๘$‘aa~พž4ยยึƒj[,ะา้๖จิ‹j๛1Œฌ^๑มใ€T;lKด7ะืฯณfฃฏฯถชก?’“{pph฿อ 2ิ)วmฉิ .?66bOำษŸฏห1๖ˆA‹H lรฐm’1Lฝ%i/p๘Eึm‚รๆศิ ้ข; คwLOพพŒu šŽ๑U2\๒้๋{Yญโ3E๕ยา3ฒzลว6Aจ?e2พ˜Ez#Œšฐzะ n๛จ๚=ก๚ฺEu–ีีฯ<ีTRT฿๑ขz›กฺจฺŸ+œDYญโแƒ3T*าฯCE Uงk"Šญ?_ึ‰�ถ๏ต,>c%…BŒq๖๏HO=abˆฌ^1))ะึถœ.ๅฉŠS,อ“ฦ๚P-‹d<|"'s�Yšžฃxไ˜[\"‹ชCร๐ี~ค “'@‚ž5พพ>ชfP่€j๖ ชคจžuญฌœลโŠTQQw๏พ‹j๛|ˆึJศcGG#๖ฑขšช!C๕แ!;Tณ่<5๊ีดž4ึ‡j6-ชฯyQฝ*p E๕น;๗C๑าrRเาษ—ƒiž5[*ึƒD\k5.[U3จRิ o[D‚๊ŒŒYั5ง‘(::Jณ็.hBˆˆ}อ\ฐุ!!P;ฃ“GEฅฆ ดP;รe#สŽไพ~M์฿=t๓&ิฺุฎP Euี;๛lYชaโ๐Dvฺ์dจž๖ุจza‰ฬไ8.๓gกบ6)อuTG๎>pภ‹๊๕ขš้$DC (fnQTอd 6ฎŽ 4%‘••อบ5ฅ|}Eฒ8y ช๙ษฐ$ฒOฑกmBlดŒ'†|ˆฮ๚๘QโแรUจVะY^Toี ล ชCCษQฝ่ฑจžvี|>O&๔ข๚ š่หใษะ€ŽLๆEีL_Pหฃ๚ๆ&ก:0+’ฤF)•จ0ฦญญ‹Ž ย†เฺhLM•Hดจ=†qุR๚W๕‘GีkQ-ฅป‚๊ศศHิำุ`(…ฃ‚~๑ขGตb ช‡ฝจvี็๎ฏTdชeZQ~,-(`2ัผจvี,1/ฤ2"bb๖๏งlUTฝŸcjV็CR_ฝW๋I๔Jฅ‰|๐ฎ]mŒ๓q๒คEžDฤ FEEKxn•;3Cณk่ั#ผ~ึ’�a ]Aตeฃดt~เฟ/2r‡ื๋C5WฦณC๕๘๘ฒU‹ f$uฐyn๚ฑ ศน"1ŽjฑX%`ป‚j˜Š Zไฤยย๘8j ธCYฝ๕จŽpีQ+ชOธŒ๊ี๐ขฺ‹๊๗Uoชi€๊P/ชื‹j_~ผพ!JePะึEีl@Hว-P›ฝ$F๕๋™๙๕ฯ/z–šชŒp!oถ๏&€u5JดBแ‡QVฯฮKอ‡^พ ดกZ$เq\Auไ˜๕อพ‚F`ณ่฿ทo?�ฌแ๔๗฿า๓rจ^แ …;~‡ฬ๒sa๎C˜5BŠ+0F Bกa"1ทื<ทH‚๊cn฿ฦ฿(๔}w ี KKำ‹K็ฮน3=}พ}๏}2FFยdฺื(Qต#Q‘ข๚ั:Pฝ{๊ํ+ ตีฏ�ี /ช‰Q=๎E๕;c“Q]ŠPฝธŒ๊ล้๛ทฝจXฃj0ฮZTgdy^ผž฿ศงs`ลHmD~ฉฎgB"”!{,Ž}ฐ๐x7&†ห�ฦชน€U9T+ฺEีTชHฅpี‘‘o฿พš™ฒŒ๙ูู๙yปcSjภTช๘๘ฒ‹ŒดาR™,>ญฏฌ ˜V›xi๑%%จาฟบ:-m ฏ RŒ4ณ฿w๑โสJซฒด4ด)ญT(ƒCหช�š1LมG;CCำาฉำ5ๆUกำฤd่-;ภฬอํํ ][ฯแ๐าฦซช>ชต<Š[a_฿sวˆLP?ชฉพพ๒ฎu2ž<uj0.๚๑ผ๏\ตผ๘ฎ *๚Ž b‡j s ี‘&ๆž=[\X˜ƒฑธ๘เฮsŸTษดihฮะhz“อชฝะJั์ํ-9jYไย,/+cภz4๚Jสl�ฃด@ก€)œˆฆฝ {ศฮพx‘SญXF||ษลฃู_h3ึT" ŠฟC;c20™่้ำ DZบฏ—”Tyฃj6F„๊ร›‹๊ๅ!ไ๐Œ™{๖ธ๊„จ„=M+๖]‘ˆQmx๕๊0ช3 Wm‡jพ๋จž™˜(--0ฬฯ�ช๗ญ”šZ\\Vut7ฃ @ญŽŽ‹ฯณ ฺ”คŽ‹๎ํEจึ˜ฒ ?Zv่ัฃ‘Œ๊juj๔dผV Dุดฑ‘จญVวล•ไ•ม้Uj2 $%หจ64๗„„ด_Aจ.MJJซ =๊฿]Y้ปะm*.ๆr%ฉ6ชฟoT‹]B๕œ๙ฃฺฯ/.3Nœx’i z๏“‘ี็ึƒ๊Sรร‹จŒFณธล้+จŽ,(hPงฦฅๅๅ!TW'5ฤล๕๖Vช)&S\de฿Qภl†งŽŽžฬหƒ้fฐLท์<ชa‚ ๐,4๋"#ปซแ็โโช*S€Fqฑ%ศธpกํ’ฎฺ&ื-)+ฃ”šิ*„jญZภ‹†ู\ๆช9๏ ๚0ฉ/ฃZฏ็๒}}๋๋ลร’b2mlฌn0ล&ฮQ} ๚ุซž<)—หยค๏ๅN—m2๑xกกพVTGีCซขjพЇqœ šVZ�1๕ซ๙๙ท :&ฮฃˆก”aฺY]ฑQ0*+Ci์†๘ษh,ฎฌชji‰…ŸŒQQ%yา,ไN ๔Ž๋ซ[[แวLceฅU Dnh€MัIล„ณซ+*ชผ<?ฟทสฏณณผ\./n,Yƒ๊‘ะ9ฝขขฏ*ฌง'=ฝไ"œ‘้้YYF๙ไ•ผjมjT;FX`มŠj“Iมใ๙ผH๚‰Dvณถ้nDZš฿{aต^-|ˆR๖"TŸ#๚FV'@0L แ8Audคabaqช‰ฬ๛๖1™WOC€ํ็‡&Sไธ†ัฬ/พxฑบE~ฌจ่อ ห5Y'`q{ใ… I0ขสลลAY ฐM,Z™WfI`2กg๓ณซสบปcแY๖จฮฬLฏศ^ƒjCฎ,3ชฑัlhจ3ถทฤึลฆEืีีึ–yฃj0๏\…๊›/Ÿ“X ZQ]]›:9ผ‘พi–š ต1ฮƒ๊„(w\๕งฆฆXŒ>Pญ15tลฦ๖6กฺข5|5ชน˜T_(˜@k‰oKKmกหฤ,Œ)ƒๅwƒก5yฐฐpp๐๒ๅ^FึศHJŠฎ.!'=/๏๙„"]๑ฺvQg[„2**91HeKRbbaบ.9แ๘q+ช/œ9“’ืN)mธืŸ“RW—S”Ÿืw:ฅื6ฎ บศ‚๊็ฯงคd?๏่(*๊}*บz๙rR’."ป+ใซฟพ|s่๏ƒh:๔ๆึ_฿l2ช๙ูjTปUใQ5\˜Œi%ก:ึŸฌ|ฆฟัg๚–d;Nt๔ฺ ๖^n๒rsีญฑล“่ตHP ฿ษTKิ˜3T_˜šŸ~ถ4>พฟ฿›Ÿพ๓`n๎�ฬ&Zฉal,%G7ข+Jy๚ด็|]QLTIิดด4DDTT &๊Žิ\ธ0rF“ด?%ฅ/ด๕ S^ฎ ฉhทLเ๘=˜ยuu EWJš›•!บŠ|ีฑฑษษ)—+฿AuC๒`mญฉป5$ๆ๔้‰‰๙ค11๑๔้<oTฝีพ. Zทๅัee๋ŸxlŽ�Xcฉq” 9ฉำA๔ฝีQ<๑๛ cิ0โณCฉมไจZƒj์หƒปศ€เ์๗฿,hฦQฝ{ศ=;กฑž›[žฌซจzณๆ‰‡>น~]—#6FDœฎ•5ท)ใโ“ำท$ ‹3๛ํG"Vs่‡ีO}“ืฺS”ฅฏงGง‹XjˆชCฑw๒ม/๋ีƒูู้\nPภ^ผˆ๖๕—o~x๗C๚๒+Trkอๆฟีทึผ๘g้2ผŽใ๋ณ?ฏ๙๎ซ๗??์ro<๛ !ฆ?;๛๎!๛๙ะ๗_gqฦฯ›พ๚้‚้h๊”DGงชหสจPnjวTฯš—JJlM#็ชน\tฬฅ๚‘‘ยยจถฬข”+Wฮ_ฏKั2@YS฿Q\? t-(ีฅง——็ไ๔•จ[ห+*ฺฺ’ี฿YSI#g ญ:eEcใ๙๓สขt uฑ%W&Pซ““ g[sีTKฅ—[•<x๚tVKyHLMีiq‰‰GŽภd ]…ฮ‰ชU*ฉอpร'ภชM&,€฿ััฐมฐtศŠ(]HำI๒ ฦ&นG•Q‚๗€๊๎IEดูl”€“ฃจฺš"ฑœสbู฿.0ใ‡๗'ๆ'Vฆ$D�ีึHKgfD๚—๏>็็–‘๔ใูฅฆK—๒ฤ^ฯผ\XUีqO^˜/R@&บLึ1’“cA๕7�๛ืD2บมhi้OฌX…๊์พ๒ัฟ}ฦ›๚ๆๆมๅ ๔6ฮฏ)9บVuˆ”ŽoE„๊ฏ .[ทVฃšเ๛๚ใ.WG=.“๚๏]๎C๏ๅฯฮ’~ฆC฿ฏ1 Uw๏~ฦ•#LD๚ Nธฦ๘๋ื!ˆ A5ุ ฺกšอvŽjะ"อ/>˜พx๑ภสBวโ๐าx^คeป๚าฅšัDWˆฒถvไŒ<ฝุ`ญ‡ ุ‘“๓๔i[Gๅใษ๙ตู-IูํeเTฤ@tMฏมพภ�ุญฉฉ๎K”WŸIน'€5๐}๛ะหดด(••ํyึ๐ก:ฟญ-&งธO}ฆ๎ศ‘ฎžบ=Eวwv๊ŠŒ&IbbB‚2"!=ฟชŠๆูQต;จ๛P๙‡Dตy=จ—ซิ8๛9ช+ axฦ%Tล๔?8Bต่ีพ}ี_rณ~๙ฮฤ คฺื๖จžh‹/mจ&|gaาตžฑพŸ9๙L฿ฏAต๖๎PW_๋อg[๊๏ข:mTGฮญFuคีใปษQ๎ี8ช#ื ๚ฬPฒ#QํfT Lญึ/ะๅจ๙7รฒBI‰๏ฆ,ั…ฐช™œLเm๙‰ฆS11๏ขบ)$๊ฝ$@บFG๛๛kk๓,น๊y—PฦDKAฑ7oฐูu6ื]$~,ฝก‚šrtŠ T๋RŠ‘๐#ทฅ51กๆส.~B๘ิ[TรuเT๋t1„o๙MssDEvvGGJN๖ำ*Q;@ฏMƒ๘Fพgฅ+จf๎๕ฦฑ~Ÿ„/c ซฯญ‹ิปญJ+ํ3ด็-GœzโฤY7^m3a}๓ฆ.%Eๅ๋ 3s4ช~|;ะ–Ž T“ ๖๑จ–๏?>z.\XXš.ณศ‰ rM‰‰5งลVTŸ•ืŒฆื;ฦrrชชบ`^niIษo๏Eจฎl/‹ิŸ?‘“RYuับ๓ถDH8›sวu5€๊œ]”."ขฆฆ์ภ… ี##ว— ๔ดีฃ8+ิ”0ช;: ๅu™Q๒œœึึยหqI("Ij-ŠAฒ&ฯชื‰๊ฦอDu !ชO~จ.AŸุฅจš%:ไ8Xูi‡๊ศf@51oณฌจพ„ฃบm5ชk�ีŒฏ‰๏วuไจŠ˜2IUใจพ๘ตk€บต๚#่gŽj“๐๛:(ถDีT:แ๓ว’X'ชํ|uฟt)ู}vจ†#ผii๊*T“Gี๎ข๚ภฤjTG^(@จ.ณก:๙T.ฃ๚ขีS8ช•คจฎ&Du.ช—Q}นฐ๎Tซw ชŽชลnกญทtทพุ0ฌ}ูl(บ„5อNœ:ฅT zOๆ๛ศUwชฑ ๙0๙]‹ชDต-i�;Ÿ™™ฒ.+vvึ…ฃ:w9ชฎ8า ใึฌะไๆถŽ@&I_w3‰Qฝ๋ 2T+•“กZQัุ{zLNๅำฏ]M ๚ฺ ษ’ฺPอ ฃšYพMแๆฃ\ู—W]=T—q+ŠดF7Qฝ6…ฒ~5’ฆตU2=ึฺ๎์(WฝีLฆฑยโ๔;OŸลืธงฆฯ@™ๆา๊d;TŸฉซ/ึh,Q๕๕ฑœkT]ุ ฝห ฅfsCร ฒขฝํม†–1„j”�)<>ษ@ถปพไ(ล5:Š˜}ภ†๊dฅ"sะไ™{ฮ+•11ูลษษ ้๕iน€๊šŸbฺ๗ytTํ.ชeฑั๋ีU“๒šƒiSฃBBViญO€ช๚ƒกบฅY,/Œ๗ t-W ]`นษ‡Fยฮ_ผX๋9E5Dีหจnณ บชป;3นฐพIžh$จ9Šี!$O8ิำŒฤzฐhจ๊ ๋hZI‚ะนปHรj+ช™,bT+ธTd๓…ฃ๚฿@5วๆJ๖ตŸ้k …lž ๊๓ฯฯบ{„7ๅ๔ะ๋วฦโ๛ตตี .GีฮPvziุี&ฆ–Ž ฿พmAตม‚j>žซถ ขjKฎฺŠ๊ๅ\5Žjœ80หาOทใหŠึจZ~P}x/- SrQ“›•œ|๚t™-ํจŽˆ(*B๛ะ7๗DD(๗“ฃฃJez}DVข๒๔i^หฮC๕zrีn(@’ิฑq<fEีหจ– น ิฦ่"๖œฒ™๐ฝเเปจ>ฅ4พ)kKณบ".))*็๋jT-”น‹๊]ohP,† b&(–;ป๎–ฬˆ/ท4sU‰—Žิจฯ—็ค๔๕มนsผุ—ึฆ‹I/ฎ ,ฤv“ผฬ—ก+AไoRTฺP็Ž*๎ Wำ(b2z ญจฆ๙K‰Qอณ Zศ%E๕ฟื‹j[ณg7Hm‹ซผhฃ๎ไษณna[ฟ!Tkฦฦ$๑๊ŽV+ช]ŠชรยPTอp‚๊9ซงo฿๖ณnXP€~]ฤlหŠฃฃ๕’ๆึe{{วฝบย ‘(99ฟ&บงMฉll,‘ฏฯอLฌจ)n่R*ณ{2ภ@V่<OทฃfkCืh}ฝ6ฉ.BŽฒi…—'1ต5ชึw')แธ‚๊ม”ุy~ใE}'p_™Sœ7pๆLDD}อ� tี๑-Uƒฤ-Tw+ฯ/ึjƒ‚7›Ž  แŠแ„ธ{ื*ถฑ^]ปจัฅพTงฆ‚จ(k„<ช ZF5ญuีปL ฺล (Vดž๎๒Dโตษ‚˜œ(A,ฬY‹ฎ:frฒโ›ส\ำ่hNNEvผH*ๆฑศ^ฆUพ‹๊oษ˜ึ“dCuพ{ฒธฟ๑‰Gแ“l๒3[๊ƒPอ ษPอr„๊o�ีึพtŸt/ฑ฿Ÿ"‰ฮิA“Œณ๎แM˜ซ(ชŽžLํ€ˆฏ“\ตํิฐขฺiตโ…๓ยยƒ้น@~GๆๆN/-ฮ™๗๎ตVSๅขœ…ฑ+ณ(็ส•๋ื๋r ีj\W]YYgีUŸ-Lฏh]uo_๊Xf~>$@�ีูz}_ŸŸฆแL]aaj—N™ุxzNŽQ‹๒ฮyGอฐ๖๖ชT๗งงƒFJฑ๖wšQพุ๋่ณ็HmŸีuThืZ�โfผ\g=ม˜ จgFXฌีa~ีJ๋ฃFใFฤz>ฮPึัš_,“mช‘m™$>ชŒ9aAต๎]TGdFฟTwช+Œ*Uœ‘์ี6g=ถส}T๏บ… หQ;+@s[c‰ทปฅŽyS-ฏณ-&!:บฐโHฅู48“S1™&“…†*TAคBจ๎๎ฎK„,"Ž๊ˆจƒไจึ)-จNp๗#]žf *ŸT3'ตDี *›ี21 }›brTŸ๛y]จ~ร•ZšภนหC05Scๅ สS๋@ตสไ๚sีั“ัญmฝฝพวQ5ŽjืtีVT?˜ ำภ�+์ฅEณูšแฆ•ยขฐฐผ-3'•หfฆFGวฤรl€Š๋FๅGj ฦ๚ๅี))ใjไaะีะฏฌจT HฉIhฑpใWqMฆฃฤI•šผ๚ฮ™ฏ zดฟข*nRฒ๓‚บAy’’RyPRS;>aษ•๐Zบ” +ช๗rฤr๋ˆ‚ฅ_&ƒkี(ะาhเ*šน ฯ/ม€’z๋ฃ }#…ๅอNK`ภ€ว:Ÿช_—)9ีt?ึถ=?y2Sม}/ ๔Ax€  {ฟ๊uกzื™ฑsึฃํ3Dฑ฿ถ•g๊ไเใt‘YZีฆำCงณYgููๅ#*าW๙์(Bul๎ขiษาEสฆคฌr๐�)iN๚ํฯ๓…STb[QM!Aต@ฤ๒wŒ๊ฯบP/ฎ%ชv3} |rช้nBฬู๕ผ์&ไ@„fOa๑�กh๔คีŠw,, rึSฐฌ^‚๑ฬฎ)’ั]ž)ื่ภ!ฉต\ง+..ฉฺ[ช๏๊า้า+*‘Tคปลยก์์ฝ ณ)ฉฎNงห&zsszz_2zฐ‡โสฦฃ`>ึีS8฿"Žึท$ษๅyy๛lจn‹ญฉ4™2ๅลู}p‰ศฏi]�ชj]๏•�์ฃถ–฿ ๚X ^TŸ”ื}ิจวjT ึƒ๊์๕h_ๅ6ˆ๊CpRt็ฎF๕ไ.gจN2ธพd8C๕ฎo‚ฌQ5ID%rU{]ีŠg–จšzะํgฬฐขzp]จa๗ฦQmฮลQญ฿LT#g=@๕าา๋g๋Guฏ๛จN฿9จ‹แ@๋†/–v�์ทญฟ๎๕๗Gถ˜มมึ™่k‡|š๕QpŒ฿ฝqTRฟj*ค”al]kฺ`๔ aaเR‹lน"์`}๒คัจxOญฬฉ+“ฬY/cศTดาศฤ„ี้ึ›7ไ๙Fศ‚7ดw/Lไรฮb๏CMฟXถฑ้ร9เ ุฅกCล i ณ’บ,j ฬชRโผ๙ฯ_~ญP+พ%)๘๙žๆ ี‡ยFี*}›|๒eล๏๐:h7~v๔ล[วกฯ"  T’ ๚ึ'ฺTํ'ทHยj-jŠq2F๙f=G๘,ี’ƒ่ ฃra—ชLP\@yณไิ ssz;-6ƒNƒฝhฮภd@3๖๎e nshยคY8D๊Xถa0ะ F”–ย b =�ฐ๖1ภ:žEัถฒมภmK){aื หฆ4ะ‘ภ/ศC^ฝ•บo฿>†?zฦวiืดใ#๓ซvcะ…bฤhŒMUฎ2AMMฟ๊ ง~ีdจ>จถŒุ่OHุxม`1.rš}K๗wzฌ้Ÿ8ศทฎไดฏlฬถRhŸช?ฒีjษท„„<ฤด˜ฝ:@5„ีจ969ช-Qตƒeล๏๏Xkl*>ˆ๑หMตัhB”๕ %5mอ%|๘g>ŠศP}ะ๖dค฿ฝฉลYช๗บ‰jไสk6k(T๛—๊อšู\qkP- nฮfะ7์r๕ซ&lุ๕~QMea\‘ˆ/VG้ž<ฑ6‰ศฬ‹?@ฯ.’†]ฟj?ฟ@›D@|"Kฌ#5UMœพ’jฺ—N๎ขฟem ีปพ_ร๊}oึŠXpKL@กฤฺยC"!–eฦpUCXฝืมฒข@แ$ba๕ƒึTไ๐ OMF1รhH<.๎’ˆฏP„เ๊#ผ|eนณk:I|„ฃั[RSIŽ๐&{อf—vช]j-€T เœž;7‡Œ๋˜Œปฝจvี ั’ M~~ฎ ๚ฝ๔V�ฑ1‘dp๐ิฉฆฆ9G์ ณฏHเ๚8Eต@ฅาjตช่h‰„๐L…กฮ’ฏ฿ะ™ฮœjYŽP}๐“ีS๗ซ]ฮขj’ย๏ณtW(xZ•„pƒ[H@ภ`9@๕ฎO(ฮQอwŒ๊Ž6`ซ�‡๑…Žฃ^พJยf๙*‹0๐=$G ฎ?jย}ฝYNยaห;A7๊hย‹ฦ๔อ4#Cu๘บz+ฺŠ_ J^ฝsว– :&3*zS†DภaR]C5[๊ ช_}TS!kšŠฮขbฃนาyิQวr?[:‡$ยSภอิฮKด*ัฯฤa(้lm๊›Fีปnญš�ดCNQอ &พึ*ฤ\ ƒ[ž–ฐ\็ŠฬFีปn:R€๐FีˆJ๗ฟ๏฿W๑ฌCฆฃZช•๑lC!c๎งา _๓/‰Š‰‰๘Vแ็ฯกZ`y!™L%P๓๐?7qึ’ทม ฿ชKK๕ขฺT/ืฑlฦP*Pๆี‰G5•ี๙ีCฏ?ช—ืTจ–G@o wfๆ0๑w๒่‘ช%ฤ'ฒˆ‹q8L!n๑ฅ?“ฒหyTํt6:Œชwฐ*ฌvจX;ฤฆ"ฺ?RD\Ž<—„�kโะœ๊ี?์ฆ‘ฃZ"ณˆ๕๘P ฌพ8‹+ๆZ๑ˆQM‰เqุ ŒƒHML|๙ฑ$t‘{์ฑข๚,๑ล๒t0€๔*โ9๐%บ‰จž&O€ˆl[ฑฤbทPฝำว–Dี›ˆ๊4บ฿ๆก๚๕C5ฯพ ื7lี\6*Œ่\1&ๆ%.>ฆฐœก๚[ฉณอ฿qTฝ*ฌฆ9TฌBTMc~F๘ Rพ&“‰_bT o•้ีปn1 ฺU ไชแfำลล9ถupธ|bT3ฤ<,„`H-ฉtโ—ฏD\ถ”ฮข 9\ฑ๙*ๆีภyx 6‹ดฤGx๓ฺ๎#E๕9/ช฿ช @uศฆ˜˜4_PMฺ%@ชฃ:ch–โก#๗๕kT?|ˆ›กขšM๗g2˜lŽ”#&>ีY,ฉำจฺ9ช$@ ฌฦ๗ภp\หŠ€RโhrŒ 1˜,qe๚?!โ8W iaน„็lY้ล9ซl”Egs‰QMC)คqdแ—y)๑ลๅ+1‡Žถ ‚๐„ๆกš‹Iัหะฅฎ‚x แๆ L็ฆรรIPอ็ฺกZฆzQํ‘จ๒\T6†j*ส]ะย(tŒ๐DYJ็8ชYฮ 4ฆใ,2\ ช—QMข@-]V �k‰Q=ล)ชaํ‘tY ฮrีVชqฏ/Œีป9k๓T’ww๙€}ัˆทpˆj6๖l>๑ๆlฺยข?)ชฯyQP}เ@@�›ณi# nc๗:E5ƒ*•H8ถซ>๔๚LzHŒ๊รžU‘ ๚ลอ__ชูjbT#๎Y:–3ฉlbi5[ศqVธ๑eEฤšKAตuY‘ษ"๊<kฮค“ š…P-rโ๛3ษPญ–9S€Xข๊้9]G5‹ี฿bถX…NbO่ีถำ.0ฤGผd๕ย ช‡๏c๘'Aญmภn/ชที0๙™›7˜LWtี^T;CCdจพน‚jาจšฒŒjC‰OdŽปตแจฺT๊`œYPฃ\5ไSˆEยŸุ „๑฿ š ำส1ชw}๏OVXฎึบ”�q ีk"R› ีห[๚ำ9A5๘a[ิพ๑กT›5 {QQMแJต"อŸ%`ถIŒ‰—ภ><“›๋‰ ึไNe _ฝ^$%แ‹BLํีL)IฬลฦvผQอ9ชw}f-๚vv]ฐขšๅีป šๆี`WG‚๊h„ Nฃ๊ฅ%ช).ฃ.งคจฆฺโโ กš$ลต‹ปyษ๊…ETŸปs?4ิqัy >คปŠjƒŽa%%^TปŽ๊M. šIธŽ๊ะพ›ฤจวแ™‰ ฬTOLed :+ G5›K†jชTŒฑ9o:K€ะ6ŽjkXีNQ oู_บ^TEGจๆ;ปlฐุdจ๖a9G๕3ีภG— คจถI4ศPตcTS๑ซ๑LTO?#‰ช๏,‚ญฝช๙,WQอ(ๅ(xฝฝ^TจfPชฅ8ช๙7ษภ435ๅ‘จžz›Aโ๚" 7†6ฉ$จๆุPอ A๕฿˜#ๆ พ์ณฯพf๓>[ฏฎฺT[ยj†ำฦ๊ี4ๆPํฯpถฌ/B'Auช ˆๅะฤŠ๊g T็จv=ชฆlFTM†๊ฟ‘ภq“ฦโ)ชƒeก ี2_Lu ี4F,คชณณ?G/\` }.2ฝจvŒjุFฅโ‹qแg๗ๆะ‰ฒ๚ํ[\T|;OŒ๊Œก็"\ศJม๘คQ5อ1ช฿`B6WกฒึHK>[gTฝ฿T฿ฒฏvน„j๚PMsŽ๊]ไ Z"ค;ำU#ฝรย๒Uา Tณ0g ฒ\๕ืฎ%@HPFผ‰จ~6LาXเฮใ€TซT\Œโ ช#K[ZbๅบAymํ‡BuAH0WๆEตี[ˆ๊,WP'@ˆณณ_r่R`5OC ‹ช)@hฎ \›œีห ็Q5ช&@ภjีชˆ๕์Pฝ9นjŠcT;Œชลvจ&>ยb6ี‹j/ช7ŒjpHPฐm3a?ึ๙91š^ฟš๗@ROฬฟ"N =ษ]is ๆปญ šAาR[ฐ‡ฆCX ษZGHŠ4F๚• ๙๙e ฒฦฦ”สย๔์ผ�ƒ>55ณš,บŒ๊ฟ ซœo๔fฌC^XYฒกˆsT๏๚„ ีl!ีฉ$<|‘ฅqSโ(ชฦณู‹ช?!ัmoVฎšJ>wŒจญ@x๘ƒ๛ท}|lๅB$๋๒wีฅนีะ@t|2*z˜Hge๕ฦฤ@งD-ทปซฟ_ฉฬฯ/ฉขช-ฐฐ8ฏ štี)cR ™ด๊ฌ.่“_Yr`yีI ึฟ4า˜ะ/ฎ?FY˜Ÿ๑"๔)ซƒnไ้e––]™!…ตํ่ว–žึย๔งOกaAJลำง--๒#O=8X[[ๆEตีNฅz›„j_†?qุอgƒ๗<5ƒทkŒคHฃฮช]สUCXf๓Pฝฑจzื-2TsC๕ฆๆช7(ึ#@ฑฒ๐ธ3P๚ช7„๊TOyQฝ๊S &วv7้ิ๒’ฬฐiึ#•ีSณณ$฿ว๓G6u ‘– ี6ฑIoณb6*ฯQSึX"qไ] K6ธ11ู฿๑’ZSRขฃๅƒ๙5ูzsy๙`ra}‹ ว›‘Žย”๘ฯึj†ณ‹.โoTcชำศงŸBomwฃjRTsœ-+บU๏&9ย"lณPm6/‘X †฿ฬ ดญดฒ%!‹แี‘๚ค†สJL_1y`uO†&wd$=ุVžR๘๔iWGfก<::!กฒื39Y7˜YSู?˜^lซจvิฅงทถ๊R*ŸZ\`hจƒ๎ถๅญ๒ยผะŽŽยBcLแฦฦคž๒ุูเ`๑้ปจZฏวฦณ’RctWฎ$๕ิ~๗อ›บฃI:–๗rCห|=ี|>O†แจ G๕Œ‡ขz†ีaa๘f ๛ๆƒ฿|๖ลฟพ๘โ‹"ัศ๙sฅจ…X ตtึ=!ๆmnสๅธฌฎˆˆำต‚๓ๅ9)pŠฉฬญ./ONL9^cอGl"ชr*านˆิตจš$EƒPอrUCŒ ี๔อ@๕Ftี฿~๓‘a–hำชIQ้ง๗oใม€jตZJuีๆž†๖vถPฝf›RC๕่h}}jฯXQN^ุH]azR’RYฐตจจททnTwไHKKLDEeุHa!+ํฏฏ?>ฆ(้SดCnW๒เ‘#mืu9y}gฮOmnˆho๏บ^—Sศใ%'Wi\‰ชkซซ๛ฒฒR•  ื๛CRฺ{z ี ‰‰55๑ qh€วฃšหๅi!]บ<W}บ‘6ฝžัh<ีogHPโๅ#›•Bฅ๐๋jƒ‹B.~อ!ฤผ5Ÿ4'มœ=z=3ฅรFฮ@#ะO&ซ-<พูQ๕ฝŽ˜œBใท$จfธข�Y7ช!ชๆbTงbฝOร—ๆœDีุš1•ๅ,B]Oฎฺ้–๑9›%�™›{v,œ$ชพว[,จวRณฃ:๒Bu[Wc#ฝ@๖Nค4ท%9๙Hชน5D๙w#gไ้๙ีีษษ๙งฃฏๅไ””Œฉ;^฿STžvฝ#%…วJึีิ47'„ไ_ษC{ศํnKŒ9}บ"ไ๔ฦัั๔zU Dตตmu)†า‹Gีง+ฺ&+yฆฎ˜„ึŽˆ”ำงฏ_/L‰kTWTcใŠ+/^<เูจฦ0™Šหย ›ชIQ=๔ฺ#Q๚5ชฺ’ƒC”ญี)|64฿$Cu5ฬ๊‚ฌK—๒kส๏ีO฿ปwlD~ผๆ่ัาาึ3rkTํฟฉจ.ŠI๘z#bฝ Zฬu%ช^Z\pช�กnฒฎ๚อz>ทyฒ๊……g$พzว�ีถญ|8€j นบG๕… ีญฉyOฉ€๊ิ‹ซปภt›+kMSm{”ํํฃ๒#• „c—/3™m0๗๔ฤUๆ๑ฯ_ฯษIใษuตตSSƒ{*พป‚๖ะาำูY!๏ญ„น{„o�์ž†),?ž|f$xถ-ชNจ)†ื๓ฬ ษƒ••cg`eๆศ‘ŽŽ๔ใั๐œ””„ไ„Hbำ<ีBตme„e~Hๆ2๔ฺ`๐4PS5o_“••?ฺTมใJ]A๕ ชYFuว2ช lจฤจ๚Bต.๓[งจvC rT‹ฉไบjNKำVนžƒจฺ}]ตร\๕‰uก๚[•4 ……aBRช`+—$ฎDโ@นีyมฅŠึ่ผ<ห฿"#ญI๋‚๎,{T_ZFuT็เจŽw„๊l ชลี5งว–Q )‘l[T_!{ _฿0ุ_\\wf0AW_๏^z$BuzบผN‡rๆ F5M*U ธR- •ิ๓’141A๕0TrITี๘ว๓‡`ึdƒ�K%Qญี฿kศy๙่์!Cต‰ี/––vุข๊MEuBN_I€ฐึj54ฯขบU/-Zo๘ศU“ขฯ9P€œhjZวRยใณY›uฺ,N“™5=ๆใ 'RฎX pี(’zๅ จ7zj`:ั€ิ4๋C€๊ˆีฃ—Vข๊ฑ:ี็{br–Q-‰—Gฺ่ํQYพ‚๊I˜ป5VTื ;B@๕ศHแJTขTๆไ4ๆ–fลษ„ไฬTใๅหฃฃ๙5๑๗ซญUl-Jil๔ขฺีๆค$/ช]@๕แ5จVฏ#ช2NีG. บšีญ๏ีฎx€07€jOฤrAbC๕ๆ่ช]จV\ชฟTซ6OAก’ข๚ึขzี=๎ฃ:G๕™‘ใ+QตcTŸ๖ขฺ‚๊เ`ญ€ฯ.W|๛๕๕ed;6eฬฯ{Zdj~–ฤi0ใฅHŒ/น …‚T™'๒ฟ’u๒จจ๔๔พผชๅeล=$จ.ฌฯ6dกปวุŽฑ”ใพพc@่J”ซ๎p–ซv่๕7 ชSRŠวืjRgฝƒฮQญโ ดtบ๓จ๚ุน%ฝMฑบ _}~โฤฉุ่C๎“Zภo^cสณแcdตŠทƒlชj*ชฉxLPฝ{ท>)้๔้ฒ4†พง'*สhŒส4ถท[—Mhบe!T๗™Qy}qn.สQฤ]KIฉชjต,+&มฒโBuผ(3Qw๚๔T'Ž๊๎ึฤ˜ฺฺๆfดฌ˜ r’#Š ”ซ>ฺQWXแ็wVฦ๑จ:"&ฆจ(ปฑ,ฒ๚zGHHสeห"zHHM๛๘„%ชŽon-Šiฮ‹j/ช7Ž๊hทQW ฎ.3สธ!T;อUแภ_๕ห7คจฮ฿HTM–ซพuศETsธฮข๊๕ šTฌวrU#Tงบy„K-แmbPฝ5จฎดกบยTทแ {TืvNน๊ใ๕xT จV’ขT#2 ช=<ชอ`๐Tะิ6|วว_ผ พ็ฯ˜๕4ห๊ทฏศTี/‰๑u*† ิ<๗Nไƒ4‰Z h”—ืื—TตN๎rฒ˜„ylฆR™ขนM™`4ฦ$Wิ๔8€Gี.hSว‰)๓O๒๗uvQ5รT“$@n9Mา@o@(ฤœ&@ยร—ฬfว ฉ๋QตSศฉไ:ฎยฝ#|SK ๚ๆY5้๕รฤRฝO?}๐€๋c+€aaZ—หp ีนๆุุฦ2†?ฮๅชSPฎb‘ฺ•˜!™\˜9ฆหๅผ6ˆ๊สหcb,%0Jฅั8˜,ท”ภ$ห+ไ จฦRA{]86–’S44++;›ฃo@ษŒฬ]J~*Iษ,—็ไ —๒4…c๒m%0 �)ฮญจ๏ญยnž ฝSฉitโ์<ถ7ชถ ซi<ญh;พกกPZNœžT{˜\ožค�ๆ0 šป‚j.W v๋D๙๛I‰JมCb๋‘#%VQซ!ท5™ีbŠ๊tJe๛Sg›R M8•๙ตเตc‹ช/”ชวxฤl! ซ฿DEี:W ๋(,ฟๅ40=(Kaaงจ#ิน97sีฮJ`ษQR+ไบu„ŠVKd"[ใลMมz92T฿ฟ๙โจๆชdๆช๚๒๒์’}๛`๚บ�ีึZฉ~l,!&ก?!ๅ๘ล‹=็ก~\งƒrูF~gƒR)—ว(ๅตูCrB!้๊๋๗Sบฦ๊RRSR*/๎oh(.ฦ4 ##่/Pƒ^ๅw:Lแ„จง15—ฃกzš<\W]Y Аย์*NsOHH‘^F๕™3Pj๓T๏ชํ‡\@p7‹ภฐฐ—/I๔iฏ_Ox˜ด๚ี ™ช๚๙CพŽรโ๓ตั!7@mิษฑัตZืxิ"*ี$ตใ๏ุ๋(cll\\^=7+6ึk4f—”!T7ดลีdฃจZีJLทฏพ${ป๛‰QึW‘6NโB฿ˆฎ๚V๊?กZฬ•8ฬT/,lvต"ี฿žิIด๎ก๚Z-ฐzำาšนนsแ$0ใI+PฑูฎกšVช‘ษ’ดxภ€V u&ฝV5ํ%) ฆ™1ฎmี-ฃeŽ—IsMฑฑ่ษ’’‚‚†.๔clvv0ำ”ิ�?‹+วฒ ญRฤฌnXK/3ุdฒ์ฌธธชJŸซต์ ฟืjงg˜Pหใฺ{ปบ๒๓{หยบMryev M฿ึVQQRฅษ5efถท‹[ขŒyyj1”–‹๑ัื๗ั#โf‚‡‡†ฆ †๊!2วห›>8ชy<ž–๏๊‰|่ฏ†ึฑไไ]fTT]Zyทaั๔&โX๖[E–,-พคMUMตI ่๋+Cxฟpม”5ะ[‚~Pจ1โงฦ“ฝษXbT'eลg‡n…ณู่T'ญษr1‰�ร0พsTOOS6Yีผ›สบ‡๊]฿‚”R๛oZca$จฟ}; ฏU”ย} Ns ี0็€ทญฦจจุุ๒๒ŠŠlซ‡ERP ลง๕!O%ฺv–"-ญค„y�<ซซำาz๛J� Wจโ{{ั.-ะหdiiกUฬ“ ลฬฝV_‚๖ภ`ˆฒTiyyะ`š›าา๚๚ช,๎ศR‹ jžูŸ6^ๆฃัซT%yม‘&Svถ/ ๖ชRๅๅ ๕ด๘ฒ2šงฃ+ด||‰,0ก๚0แRZฦิ„'-,j ณฤจ>|๘ๅฃf?|๚#)dbWNไŸ฿ลQKRปR๋2กV6:55:;๛่Qผ^V_M ศoM&พ‚oชsตBQRŒๆ9ฦแrKBชลZยง~39IRน๑™$š๐-ส2‰๛0๖V ๚–Dฅ3Ts�ี\ฬฉjำำhาnF„ๅD๒E„D่.ชb|LศฺDu+kq‘คชุฑ|๑’%ไKTชจฮจใข%’่่ษษพชT—–rM๔—ศH}5๗g๏อcšJฦTLfงmLR๋้มVำพ]J …ศZ‰ฌี)๛"›< ‚ฃ ;Š‚ย0พaxฦ_๔1.‰K&qืW0พOโฯ3™ฟg๛๕ป๎ณ๕{ EdนgThฯ~ฎ๛s_๗u_หภ@Uา*ํvณyข‚าˆ#าบwูO*+#ิjุฆชฝีืOLิลJ*#tบ บMTžฝ&ภDฝW3‰D˜QQเ<f๘ยnซ .†}ยช6ขc๔๖ว‚…Fงซช’ง)๔uu_=ชต •F'ๆ;ธป๛™€ศ7฿E7^ปvGภf๗ƒ{ฎ`|ฃีชW tไืษT{<3๓๎œ2<`ะXM*5กPฃข Š{}�„ŸPZ`‹Jๅ9v’MๅูผNีVฤ‚]ฮzว5ณwต:Iaิุtf<Pฝ๗ษไฒIP็ ิภ& 7 oื๓ธDjล‹‡ะ๖ญ�ฉGFิ๊u์f Rgฐzํ๏W,ว%ฒญ[y*รJk+ีขUTณฎzŸŽ๊$็pCxbb8UKฃฑ™ฬ:Bi”หฑญAณP KuZต|.T๛ห2๋mั™=๛ฆlขึžQญ€ฒOBตTศ�bณผซีIJ„j^=T�ช1r€ฬi�rึ›า@ฺ:ญ:ษแX,IพxึUTฏข&ืiT -งU๗ชQ}๗๎{์๋‰X|๘R`QqวŽi—ศ 3*5จ เน#Sxึ๔4Y๐ถไ๙"ฉว?z+B ็QWHซ~Gจอžิ๊$X๓า kีŸงb๙q8†^๕ฎU‹!บu>Z5ฬ๛››#ๆoซฦmีสนP=ล„ด๊ค๘๐pาใ=%หQฑˆ๛B๙OO\ฟศnH๊T&ณWQ๙ีT”bl์*ช—;ชE ZษyV‹&&ž ก๚ฮW…๊—^PญV๒Pm0(„P Z4jƒ ฺ .hฉ “{ฒbHl� ,Ktžิ๊-f=Ihี.\WIหŠ`ำืxM%šค๋ิ&nหŠฐšv~ฤ“  kี.T ุช!žQี0oฐภ.bWม์‚จ{๛vPw*(ำฉา๙Š๊V ชฅRตUๅ๒‘a/ž ีย}๕๐k๑ม0์ฮTMฯžMQ.ุ(Pฬ jh&“ž HฅRk„YฑD"dpBต|แจVBฦ1JตšTBZ๕ง ๚œQ*Œjะ˜m๏Zตœ mnnญฺ๓7vŸ BหŠsx€ Tห… ซUภณโ@š๏?฿&เT}โึ-??Voภิ6X YE๕สDตDขทช๔ฎ:aaž  zx๘ๅื’ ‹ˆx5,ˆ๊6r+G�”G„)<wdฐK+ด ฅZฏ5"๛4&๕ฌP3/L�ี€ฟน–Qญะ*๕ชู4Kย เŸ˜ฒU#ศไฃ'ฝ-+‚Z %‡jLฉตB<๖<ดj(sณู'ใ\ฮzอวTะV Q &J๓ฏOญn~ๆ[vโั-9ท0*ื!ตkี+ีฬ™8ฯjQPะƒฯ๊ ์พ{ํ+YXŒ((x%dz๑ข3Œ[ว าซญVLีจ๒†Bฯ1™ ิM‰ื>"h�‘K๑…jีZฑ‘ิูvบeJJซิJฑ\) U‹$ Uc D5ๆอVญ&ฎI๏จึm•y^Z๕ท๗ๅพไ�ัyฬตyNศ˜7ตt&๑็ปE›โฟyS€ิF= ไกฺL*VQฝ2Qํ๏ฏิ™M*N.ง๏=!dญ~๘๋@ต๛B้`<จเึq(;ŽL$€j% “Hทjฅs๗หฒ"พPญฺˆฆ๎*แเ๑๚ฟw“ชขํี@~"ษ๋'.{DไŒ5‚จึ“คไMญTหE6ƒI5/TŒ<oVฬ_ซVจ=บ˜Oน’ *<[ณก:€HPซ†{"tVฯใOาข•*D )8€€r0;ุอ๓บ€UTฏTT+ิ:›Š[/ฤฐ6ฏจ*ฑaT๏ธwฏžsีรฐ^h– iีZŒฉX>ฮ!ˆ๊s๒…{€€ท‰˜„•:ไ3hง|ญfฝบdไไ'f<: ๓<@<๎}œ˜{Aต’0{SซมV-’™ &ผP}โฤ๓ๆfPญŸ๒xรผŠๅžXฉ‘V-„jB‰LLซฅ3‹">"€๊ฝ'ฎ๓PญีชWQฝRQmีkฌFW]!B@ศL …หฟkuDฤต;Nีเกำmลx)lJฅTHซV๘‚j/ 6€E2ฐ็ชUV ฌ&๐หค^P &=Fฮ\dตjู”€ญ@๎ล�ข‡๔j›5ษ ชม๚ขƒe^จถํๆ๓๛พ šxผฌN*เ›ฎoaT+ฤZ01yvByr‘o .*^ฟๆr € ”Z"YE๕*ชWQํ#ช‘5aพจ๖โWฝpฃ"R ซจ•˜L๐GeV€1X๛D5จVzfOาs#›๖lนUส%^PM*”„ส4ๅอ�"ลu)ณจž5๛ุzŽบ:ลl9้y Q5วQญ…R„Yใ๙2’c ŠyA๕ศ*ชฟ&TK6’V้rDี*ง_<˜๏~uํฺสGuฺyมขŠปŸ>ๅ=*ฃRงฑc‡ Vํี••า=..$คฆจถข‚๗n„หฅ Gต ฬ`…% ‚ะCƒ 7|(ธdไW & ญZ ฎ๐๕ป1ฑ‰EถPุ…๒U‡ZRm&ฏzำช•zMโผ<@จบ]„จ6 ุ^’งฮ‰&7ฯ,เ †}/ZตV.+ี6ฯk–k6‹>ูcƒJ]O„?ฎ฿zฤŽร038‡*็wTK$+ฝ„ฑ&ฏงNวปŠ๊ๅ‹jฉาj#nฦจUขzวŽฏี็ Y๋Q s_M$RQ=@ ]XKKccjjIM๙ฤีBถ๊O1€ ]%2PลZิŒFฑ“ยEแ˜ ชถ2#Aฮ]_๋cฯ5B ็“ศuBฃQฉW›…หี BีณY=๒ฤ ชEลภ่RฌXl&`ย)่‚8+ทfก•EEXT|๓vDีฎrชL:ตยgT‡็‚0ๆไ@๒ัUT/&ชกฦ†\ก„ ํvh:ไท‹aŸˆj(† ำc•‘›ีด{ฑc‡gX ฟ|ษeญฎฏwุ ฟ|sG}fฆม0ะF? ƒJ]BCี๐ƒ๋ึaฎ8^ณษ Nx๓ทUWV:[!PT1=1ำฺ*ลฉ<‚@5ไ 1 T“"ปQAต๕~มผ@เJ™RฟQี”ฬh!ž2 u’ษ0 ฐธIีfย/xฃธ6ๆ3ีพำจ?oฅQEjAต:I ฯk]”uพจ{โๆกhลP ฦj•๑ชฏ๗4hฏจC6จี&Bศ3>›@๊๋อ( ‚hทฟ9แ9๛้ฝทิขขัˆŠ๏‰็jHแtฆ็ๆ†@ฑ.๘;ค(ฏ‡ƒueฅV „28‚kIPะฦ}ปศŒฦเเMxD„–ฦ๕</Tุภˆ6–Rfˆฆ’‹ƒึ๓†€˜i„Xกเฑ1ธT*—๘นฦุ^&6SำHlฤ;8วŽ‹Q‡มัฎ_,ูร›ฎjฃ‚ึ":ฏ‘:หŠjxlX ๑(ow|ธอฌบ๕SQํ™l6-+u{�%wิํโP}่ะxโูณ_<ชำšฺss/ๆM2จ~๏น Œ^ป‡๏ใ๙ภ€KบJ‡ใ’๙@Š‹ก`FBBMM|x{cฟลฒ‹j1!ฏโI%*) ษ(๕T›๓ใกบธ˜0๙ ฃ2<€G™žฌ๒ƒ+•ˆ"ไค2(HpYัj†,”’`ญZ5ใ#ีŽ'ฦo’๎๑Š๊ ˆŸTซฉ็ต1ะ6_To๛๖ั| ะwมคฮื‰‚FฅFฅ\ผ@P–hะุqฯG8็ซ8vvvกšดดถผฑน๙‰@๚ำm'NšจpYxดฬ�|Auฤษ“ฉ–์œš‹ss,%eตti™ lfauง๗ไPํAIPช#"H2จ*าซYaœ8ฝว…๊สุoยๅ>ฅvษหaW๊๕aaR„j™Lซ ๓sกฏ$รเ๐ˆJvROT€ชฯกบ2ยH*ซจ้[ัyึŸๆP Ÿภ๖A{(T‹ั%‡…m๚cP ฃฅ0RำA# ‰Œฬ…ผว๑f๓'ฃjNYญJ—Z}ๆฝแaT฿นSภ๎ชฏ?2๊ธ๐ลฃบเX&คพ ๐ฃฬ~ii…สฟ์ุฌป›็ืจ7Qqผธhฮzว%6ๆึิ์ฺžs๑‰EELmลสbsธ@ 8ุลo๗ฏฯดฦCs8.ๆ๕ฒš ~๊”ำž8 ดฌy๒š›ั]ีSW—–มu๑†žž`ฬณ_๕๋๔”‹ป&ซฤ„Yม'ช}p€v–ฒซตะ;ชฃJ!ผฌ๎'ม*ว|Qฝํ๚ญฉyขๅถV› ว}#ตยชC~ื2ฏZ5าุaAofqV[NvกWำใว๘T?*22rซ‚[Tฤ”Jซ†˜3 ี•iอใใq9E/j4๑๑ี!9LmEะ=@ฆ@า.๖ดฦฦฺ tH~ถoฏชร์๕P.&พง5ฬ_าิd „]ฃ4ีLณื;ังy=aH@++u-แๅ]๕3 วu“†JŽ=Qx R_ k{น ฒ7ฃรoo-DฤLt ๑LvvะHาิด์žŽลOูิy`S๚KT1๓ Zฑ7›P ๎žž ช%%ฑ+7ฤb ภkP•๒“Q-E9‡ ม.\ฎŸ~๖LVปฏ]Kc-'t]ธ๐ฅฃ๚ะtKQ‘๎7Tา–๊—‚‹ŠรOีj—๕SL%%„7#าฮฯ�…๊ฒsฮž…š–}ูั‘ŸŸGW,‡ฯBต‡,ั%.์๑o92š -:4U,็”‰พพ„่8A[u ิฃถXะyสJˆถ”•z]^G[ฒหฯV`JตJ์‹น๚Cuฦ†ะ่hะฬคrAฑx}ะ:ะn{ัชqฉ9|žจFฮj๏ๆkซ“2iถš}’”ŒR=‡V’ฑช๖|N4>^กฯฬ,/ฃsัผyBะR}๛ฏ‘^oณ*$๘Qv(ี8ฌุัูy wV["๗๏Gไƒ”ใใ ‹%u฿={ฺ2ก.ˆOvOกพณฤ/๚@Cฟฌป;d1!::?ฟ๕1ซŒว8/ร~–’œ<T•� †žษ*อFjงชt eA…rK๙‰โฆฦF‹%๛ว†ำ›ฮทeฆฆZขsŽBบC‡a;ุฐกฑก;TMหn]leq่(๚ฤ๒Tq๓ICƒTšู 3ืิิฒฒ ?�ี330PญЉจ+4^อฮ(ขอ ช฿ฟOรVช(Tw�ชรP็8ํ๎Pm4๊4ๆจญ> วO^ ษฎ),ฤqSธบ.๊ไI(.z–*ŽqฌพZ�ี1ะ!(TgvTฃษ�๑�‡jIqqdBบ HŒฝซ+*ฆ&ไดถ;V8„ฤฝ*X�ีYCีg1TŒิฮŸีZ'#:ม’URvT่Eซ^ฟ^Ž ฺมฉ็…Ku> zไ๗yฃLสฌโCm๙$ฅYชๅฒนQ jตู๊yิ๘ู฿wTซปปTหๅ7o ไิƒ9ลํ+~,ช1จ๑iฒi}@uLZgfBB๙แBœB5ัูžEก:ึ_’หฤCฉ๛jNŸฆŠŒGFfg็T#๑ฃP™ ๆํิ KvvลcVoภGฦ$ีUu8|l6ช๋;‡†จJฮG{‹๋ววณ๘จ† ‚ฏXTW!กM(+k=ฝQ$ฺดุ้ฑvZvีiMฃHkส)‚Ž�Iคฒโ‚พพศ์ิ„’ฒ†เเ–“่’TK0,11!ิาTK0>ีธณZก6 +-~AMลU๏ธs็Zถ‚P}ฌณ%'GญฮํwTT ›zy๗•ะฝ?{๑€๏ฦJBU™กz~หŠPฑnดฟUฎล๑ฎ๑ํuง‹‹ฯœ):ฺŠพห์ฮM๐Œ๊ฑŽŽฦะl„jJ:;#Qโ ีmmกกต‡I!ฅ€”•้Žตgค=š–ึคjฯศ*+ าช39๛๗wถๅFฆง˜ๆkฏž้๊ฟZ^~$$ภ้*7Tc"!gฦถ/%M๓tึZ]ž?ช‘๎ ๙:ย็{O ะฃ™U`ผฃšZYT<lว}Sซ;Ž8๒v<YS3บXs๓ถฝB้?ถzDธDฤ6›Z/Ÿ$ชกŠึ‘#๛๖U์‰I๋๎พpก.0›“ƒ์สลวœฉฉy‡3ปวC๓?ํ 9Pt์XVVััž40€ddชiแ+h๊ohจclั ฿Hสฺฺ"-Eญg++;ฺญnจฮผTSดu+T(฿—‡Jz๖eXฮข --Cช››ีa๋๚W"ขฬํ‰๛๗Av‘์ึลฺ;[ขฃn9™›ŸSXุัQ~tW'tƒผ šKี๙%j๕™ฌœๅ`๗“| จ~!„ซoV"ชk>ช๑ฯ๊N„๊ !ญZ�ี^Q}tgg\HJ|๎์œิฎ๎ฌno%บ6Aต๚ชT‹ R@ญfQญšทV}ูT#ฏ:ฤ๊๏ๆ5YŒ7hP^+Lไ�‚พ—AชR(ศšอ>ฑ๚…๊ฎš ช๗. ชำจ>0'ช3…Q ๆไ๙ขบ_ีVี๖Yจฮ๛2P า˜8ห๒Aตะ่Hต๚“Q ยKXๅ*m"ožž-”Ynx๘แต‚„๊;คœ6ช …€แ๓็๏ลj๎ุ๑๔4q กLM$zธ€๊ใ‚Nส<TใiiCๅ๛{Š‹ญึศ]uงqผฏฏจฌูแ*Tž—ํ™ำใ,ชcNEŒƒ๊ำSy๚(€M๖้้าาผVฯt๛Ž๔“JdJ๐๘pถUGG>,‘Dุ[~@จ๖|ษฏม YJ.ฆl฿np$’swg๒j[`�ศษ้*9ะฐ)Pํ‘…34ช7Jีj๚yIžQปToป›วK2zD5† ญ†pr๎ลลdY8Ej&ˆPํ๙ 3Z5JกชWV}*ำิฃI{;2€`X๓Mม@EHW๕h"ส5 A5"R+๓ีงšฦวหสย$อฮ–๑qะช›Nถ—”œŸ (aK’-G๓K๛ฮ„”•งฅee(๋‘ˆš›9Tวฤ๊nฯ.ฉจเ›(a˜vพ=4ฆdั5‡:า8P RˆถHไvm‰ธ_Sึƒรภ๔ืชมฏพพŸFตD’V`Ojh˜AŒxตฒฒ[ึUZฺฺš9[Zr๖lffOนญ>)4ฌฮฯ6™ฒ2RมYSƒึ์—ีข๕๊  š >ีตZe#\๎zŠฬL๐ส…สY\!จ‰”™™ฐžk(ฌขJ* Q;vฟ่v๒\๕ภSฯLา#ยcสโwQ}ธตธุแ‰ผˆ<ก๚ 2K-bCiป'D%‘m<T๛๚hฮrhุFm7B๕ูp„RbFสต wvƒT>Œๅ38`ฯyไึ‚ญ:ฟlaAม๖]ฝฝ<ฤpฮป๚Zs0ง(ู‘5”š@ูชๅžCฟำ“ช!/•€Z=Eiีญ#๒žxิชO\๕˜bษ#ช‘‚buผฬปล:ym|ธมช‚ชใlPx๖คยกCฉ@LŒพ”Yดกํํตตa^ณŸ"T_ [ฯ-q+HF;w\ซ ีงN5Rจฎo้jlคQQRRWท‡uS๎ํฑ$8ธ‡ฒZีญ`ฦN๛แีฮKีู9Cฺ\pื—Ÿ?฿พ!1šBu[[H Lท(TWbH\)ฏฝูกC5p0K7Tร!ีศ5ณ:ืbฉญญ)TPใ\k‡™4ช๋3ีภhีNgoซnก๚ฑณPmณeeภ:zttv6Z๐\JTKค„!%!ฅs(,…p-qชแ$iาจbNค›šž=T.๏พ|œซWŠVัิี•žž’ขช๒‹ˆx๘๐•Pคโ๐ณฮ&n8‹ญVaคLคU{่๛ิžP‚ดj๐ŽJ้=}บฒด๊†VีŠฬอžR$ชซYTง=ใh,ฌ4;))ปzบป)T๓€ฌน้ๅฝh@((่)ก\ฑNฑจVช=p%yC#ฅUG‘AATขซใ‡้4๏^}gอ8xฐ$'ู•5”“3„ดji€ฺSี•^ฉEจF“ฝสรษ?ˆฉœ)1‰yุ๗_/{เีeOjuทC€ี(Tธƒ˜ ‡น:ˆ;แ*VOr‰q2ˆ|0sจฆ๖<๊ีฏตพจี๕M-‰‰qq==๋E๖fม”z`ธ}ปi=7ลำจ‘Hโ“V}dภ ฉา™้p๎๑oบิพo฿iฺSว›œีC!e ฐjอ ๚ ‹jVซฎฌlอw�‰1ธ๓ฅคิึsก:./ฏ”๔ฦัา ๊iR กณ€Eฎฃ#5ตู๐<กzิ…jงฃ: ะ<! T(ภฺ…๊f7TC,LU=B๕…Bี‘5้ํํภ๙ UKŠj)ฆ Iu)าก‘!‰ร.h(ฅฅJ*]Tใrนษ`vUร {๑bXศd๛๊Uน ก:ห๗ซNKsข˜๒ฺ`("Xง ,ีO๏๑XตZƒAฏลhT ีเ,KAา ฉืŠ<ุชๆUVชีฝฝเฌ_Yษูช!ซพ๋‡ตณ”ใซฏ{tnจ>ิฝp2'fd€+HC๙4ญUvอbฯีื๕7n”ๆ—WีลฤภŒิ’ำ@9bqZตVั%ุฒก4ท:ีRt˜บ$‰ ":ฺฟ?XZ’ท๙๕ว†Sชฟศ๘ๅเม์’x#kจฆฆฑ?d_ุชm๒ใณ`๛แAEะถj่/bp›{็้yQLiาอ้๋฿~๕„๊ห—/๚์g6ฃ3้b0mฐ@ขAPฌŽฑ™G„;ำำ‘๑"ล.z# )™>บbHhขๅmขViภธ2๋ W“=ฮ…š3ณซ:.7ฎj6฿ใeQ๑ั#ฅkŠงDQl" ๎ณญzBjฌ't:ˆฐ[u๕LธJeๅษK‘ฅเy๊TŸV ‹ˆ`iˆE? EG๏็Dร๛iT_<s&;;ฒ?+ิฒhwwt42/ื}yๆ ุศัเUซฎ,nา8ะฆ=lœ‹ ีm|TS~~”VํBuอผcวขฃมqIQEฦง&ฐ่ศศฤ”]จจ*2/ซTzกLZพกhฬค’C5ƒy๐L@ปf๘ีห๓”ต:๓คiED+†‡'&n๏ฉ†โ/^P๔ลtXgT‚qงะLƒˆ •ฺี ทฦP=>Zƒผ‰H’ฌ๐‹•de•๏gยšํฟ”–ฆคt9s๐`ฮพฦัŒƒjŠt ชมษbษป€พ‰ŽNชรGฯๅ/ฟ๚๗๙KvM๎™~K*ๅ฿ ’]ฉ5๛)C ซUo\ฆ� บะั3?ๅ/ๅๅ๑แใ?d”–ถwคZj๖ฆ[คจ?2พแFvNบ!‡l็เ๋ื %%ฟ†ๆ3?„nอศ๘FIŽม้HH-/ฯ,)ชซาซโส<G"4PSแq(ฤชฦ V[…žœU—˜ุ๖bZuc#ฺณV๋ฏ๙O;ฺจฝ=5!€N%ฌศBาR5ฅX#Zึn|!)้ร‡ใƒS›โ_6ยPฆX/Š#๓Fผรฝฌ:žโ-งLfmŽ|Au“ำ๓ฅ  @์sAK5•#Ts‹Š$ฌ›จds+ี|gฝ๚K`๐่ฉ ‚|‡ฤ้ำขโLdAจމ‰ฑว#ั< P}&ไ@9’T˜๑ต๊˜โด๖ฌ†ฃˆู-ํเFZTT๏ฒUชGGsr"๛‡�ี๛ํศp๖l02  กšัช#"์ $†พ>@uiOจ[u7‹j< ูชŸต![ตJ5”Qsก:tiQใ†ฤHฮ‹:2Dฉœว ๑ีp=ผkตkAหฬ|บ[0ฝ -„ฌ`๗yp๏KY‡ิ&โ�‡e_ต ฬบtำP?hL:’.ตๅ’ŸC+  \บฤ…ภ�O๛ฒปดผ`่๊๊M5P—ะ”rยศณU7wwAฤAแFื‹+พ ‡}g{CzzศะะPBuIz<”ฬ„คขHำ`N“฿ัชƒ7€{\ฉฦ0Nฃฺ`่'๛วฆcเ›สzv๒Kษพr“อชLอสˆ>x0?2 ;o„ž8tใุช3Kณ[[ป.5––<~L่ฬ6๖a€ญ!‘ย'Kห G9FTn๚กม๓ขS-›ะ„๗๗ง':โใรใQศเ?D๕ฏwP›ัย ่HยๆaนQIจอTนlG๕เมขPc<€2ลj!zWๆ–ADN…ฯก8S๊L0$่๙ 3ๅ`ขกfCt56า'c5งBศ฿<ฬำ‘Šœ๙C.Vkฌ$90xa‚S:aแy~ฺ6R|๒ค%บ่pู๑พศ}E๕๕ฐšxดยMซ>vl<:„ีูเาะูYZำKว@RจๆXœ–ึีืใฅNSGPซv:/–๗ž&ษฯฏ}\7 ี๖Cเฒืษฦ|0•Sวฝ ๛‡_ฯ.!ˆฌœฒ๒C‡ c€๔ก:zษP๑ขZถ@Tƒ"$„ถูl&+m…aMว• ฃZ< ีCฅฅหญถ–ฎั๏ฟ฿ทฏq<๋FiyญB~จณZีืฎ…†=์๘๋™าNIษx๒ห%)‘ญ้Y๎จfด๊: Ur@;๗ร_n\ผธห6๚??๎;ไŽ๊ฬ ˜ืึ๊ufU5€y(+ก:ๅ"ีjEfฃฦ  ๚ปฃ๊ฒO’O#fก‹€UEี(f=/๚jV๊y1ฆ})^‰€9†ๆ ชช=2 XŸ_oั๕m h{ฤ|B!๗โ žu�k(ŸnefB€ี๏ฟgP›ซัฉ!S์ฌภtpฦฃ 4ะ็ ฯeUม่#็WAPGี๐ ุJํ“dูข:‹Euฦ\จnsกzgTฮFu๖ƒjฝ>2š๑าKŒ—J็ู|Cตฟฟจ ทœค„)๏ ีรEa{ dฅ‘:"ํฺ+A—๊Pจ|ยe“ƒR)ใาฬ€�กV๋ธฆFฃ‹"บgึk๙k_iiQQJ|u? ฌwดO๊t๗ะ† 7n๘เ๗ูาoXrŠ&ยฤ2ช๋/แ‡ั๊ิ‘#YBม*]Dูiแ‡า5*!�ค>uชพฏฑžๅƒ—ฌŒAuฌŒซิ%wŒžนq#/o@ืาัK๔† ููๅ…ำำ ฅๅญ†3gะŽ7nl๘๏พ]ฅj้€Aคฆฦัี}่ฉจokึรQiฮัพPh% yฑ๘V’ๅฐดg ฤzRหก็N๎z`ผ็นคd6 WQีะช๖[{ทyฒ\ฆL ทoQ›šIP‡๎ซ+3$ิข+ฃ ีว OOg@‘ู*Aฃ6ฮF=ุธมn‚ฎ†Cnษ};�:ฬ(จ/M์v:5้ำฒ"ื๎?ปMะP}โึญ€�W†GP๙M2๎ชศCก 95€ิq ผป๔pN-„02sเ€๓P{–“ำZuฺMซ๎์lŒๆิ6pผป#::4š่Cužw๓ซ๎พิฯ.นี>๋Eซ†q R”–๎฿?‘ึ’5TVถั…๊Sงš;:Bแหœฃ=(6!็@ํฉˆ#Gขแ“’y8ž™ู˜W‹ฆง๗| จ{ฐŠj{C5ข‹rB*Q#ฉฟ —1}วชkXT๏wกบŸฆ"ุสR::jœ]Sด^&™ชAlณkจ๓ื79“ใEฅฌจRaTำ— ;t mm%N่fะ;๒QMห^iio/A8ปฺo(*2d6~]V1ืXAgfttแ0ีฅีฑ๋ขึักฉ'A˜ะภ…๘'fQํู๊็ฅ€  #H›Yฯ4"]ค' ‚ž*‹p๋ั^ป-ภ’aPาต>R‰=ภ;ไๅะjs8๋Oˆิสส‚K1Š=…ะ๖sEิ‰”ณN‘0Fทu๑h+ฃxAล`ž/ชป|Gu†7T7ปฃ:Vีฅs บ€Euํœจ๎Buอ’ขวSR่bฑtŠ๙๑ีRa5้๕œคฌ[iซw :์ฝz๙rฅก๚ฺร—ย&ŸPจ|ฝซฆ�กำhD|฿(ไใัMŽ‚Žห’‡jศ๚U฿ไpฤQ-1$์ฬPฏำ €ถ}๛DI*A•ฎžC‰‹‹•๊‰:jัฌ์ํณ‡Bcbš›๕”GIuZฎงฒำ็‰ญธ ]!'HFP;(๋๕U~~˜ุ~ZRบ1-ญทื/XK่แ๔aฯ�ศ)ส,iต๖๖’JUUQCKุี๊:ˆศ‰จ'ิAP…5`H&bŸEข@ฑ ีpr)ต‰cdrภ]=Jชำ*’ThZ๘?Jกำ]๒†ธ ‰ซ›š˜MQ๙„๙ิ^ี'ฐภK˜"#)๚`จอ†j/ูธ่๐(K3๕†นG…mขe’9+จญ`ฉถo>ฬำีoฏ\แex4@ลŸ_7็—ˆ‘ุํฆFห/๖Vัi๊ /4;ใQWT+๔๚ŠŠ`๎‹ฉฌ„ไขt–าˆBV็ฎ;Vฆiีะย‚˜txvR=มหWmof…v‘nฎŸ˜จยy9T+IHื[…tdค‘ญช’Uฺ๕r4…จ‚&๚‡ศVMง*ว!jE@LฅŽzAEU}e๊HตŠ2š,ชใโ,ฬ’ขE5g6ฺO@ตDBย4U็’Lนs๚ บพพ{wลก๚ๅ]มh๚จบ๋šJศn•J%๎ฉฤูFฤ“?ท*08[ฐ+.ฝๅmโฟ”j่่› Qม_%ŒEฮDoˆฃอfฟO๔ฝtำ&๎ฐk0Tฃeu'\๊jฑฑ1่wึkX#fส6SWSื@ๅrG็a~งFษ&‚ซุH!}O%รFK_™@€Œ{’`eะ“ต ีpnร’Hf9šƒMธYkฤจะ 98A^ฟพW]{ooฆฐฯ “๓lMV๓ะ"๕Ÿo$(l"n †ซ8Fm_ห™?ุ‚T๊เๆๆท'๕๖Ž\็ฅ “ห! •š˜ซภ@Fฅz JฉœžŽ vล๒%ŠnILŒ„’ ๗๓ฎxrษ๏ดฤrI2ฎ#ฃmเ๗M›d> Om bSวคN๏’๚ัเร\๛ NEสv”%@ตDฅV›อสŠEu<b)ฏ้๕~›$‹…jืชaฅŒ7Vื;๏=6ผzล%ฎ^-ญ@0M52๘<หฬTธ2zCMณY"™฿วี11้ ส๓.ี€>0Ÿ:‘#=NาUb€ขฑLc็Lช/๑ฎ€วzB๒Kf๗/œ›Sศคใัyฃฮ๖4Pึ๙Ÿ “ำ!<8wR^ฒ  @ด#Tฯ•C๒UศX…4(่ึํAืตmO<งL์๓ง5๚Y๙Y?6ไ&สๅ๖e.Fฦ%ดญlึฟพ7*M๕^มป…๊ท$้ ถUš4:ฅv!จF™ ณ ญC„ป!•๗โUซว=๔�jcื‘f ,ฮฉXF์๑Y*#sxfS7‘ลไNย2YทnภปŠ%@ต3;Rาำนิ q‰ผ–‚œ™‘tฑP ฝCI rื/Šœ~๚TPอไ%ฎ^ rŸ ฯ!ž=ๅUŸ„„“Aฬw~๓Qล๒Z ฏผ†ส1นไBตุWTK$`dัq้ˆDW]฿+hผ=๑ไ&ถภ๒เZ"ฯR9าๅ๕7๏iชQE…G\๖SจEDุ4z‘l!จๆฐถ‚ซ˜/ชๅb+š'Gณ‹ŠK”Aให IOTc‹ˆjp฿2ด\๘•hkX ม{Pฝ๊แร‚l…€ *พฟ๋ล๓๔ฏ๚ํ:HTmR*Œjบฌฮฑ8จ๏Qณžใo`เ•+ืMธ๚ms๓ย&yค)ก๚เ๗นjbนH#˜?z1๗~t…MTื้L6BถpT๛ใ‰ฟ*ชŽj%™บม[KHฐbขลC5.k4j5Oy„ส]ย๘๚ๆีซ๗i+ล’–v๗ฮฐ๐ โ้๔4oม] ูT๓ํจ^ษm1Pํ๏oTš &^"รฐฐ[ืŒAฏ~๓ฦพ Wo ฑ Kudบ [&ŠGฐ๙sมงtJ=าีIๅNฟu๚˜Tฏ์ถŠ๊UTฏขzๅ ๚Oห ีขUTฏ4T‡„จ…งัพฃ๖A๙น”.ku@X‹ยฌๆฮ‡+ึw๏ ๅ|ฅ๓4นาฃˆะ‚—JOฮฉฎขzAจ/,็=H\นๅ…`๖>ฟ๏;ฌทFๅ๓rฏ’/ilพ„ กฬPQ XŒบฌB4๏p‹UTฏขzีซจCQฝwีซจƒ–T)้‘L๚P‹%๑ฃถk๛z/ุ]�ช%h6แฒ\Rๆ�(22, ฑรw฿_๛๒I]p ยGคป_k[ฟอ7Jญ•ฯ_VVQฝ T๛๛kuf“Iฬฦ๚‡ฎ_ึชทฝ}๛๎+ฌญ†„?๙ฯv8ˆeb‹Ÿ฿|+<"A๒+Qฎ" Z]ื‰็ฟFฝŠ๊ฯ€jฉLฉว :!ฤTn้โขœศม๐ฅVบ$A์t>๖a๛fวซ‡W€Ÿร‡^L๒ปw?ศl’หๆตŠ๊O@5ไ+ิhŒ\šQจ๙yๅ๖ํo…‰‘7อพขฺ‘๚_:xPฏ/aดฝdiT_ฟฎ๓sอ๐V+Aˆๆ/_ซจ,!0==Auj*J(0AฬbสŸษฅ‹Œj‰e˜!80a๒ฆฆO‡ฝ๑ฝ๛ฅGย@๊ปwwx1<ป็ฌw ^”T4‘2้ยQ q, ธQบIฒŠj๏XัB*p’dYฐพ้˜@ถ ว[฿|~฿'ๅรr#oืŸ-ฅry˜?0”คzฤ‹K๕ทษ(WJ=-iต*>ใlTCเˆ ฃ]E๕‚ห%Rฅรมd?MMลฐT“ก?ฒ2ุ๔jw^�ช‘…\i3่Œ./๕๋ง๏=ูŽรืฎ}ูจ.ธ๖า‹Nฝcว‹ma[y ๎ƒš๛๒HgฃhตP›ถ*x…๖ŽลB5ๅ’d6ป์qXิภ•'ถ ๋œ#o฿ุ}aฎXห๗ำ๗๑๑หวฟๆMo:๕‘+Wึrฃ‘Bนhๆ—งI�ี8”0a\ฟ^บgี ึช%ม[!$งU+•Qnm:ฏ1F DuTDฉข Œ่๘๙M฿{บ[X็=\๖พH ;~T?่ Zว‘ฺhDึ|น‚Q Y’ฤb=ไจธq1&ฃT๘rขbกึNl6•ส•iSจฏŒŒxC๕“›ออ>่ีJ%ิ๛๓ ”zky#diz๋ี{O Tcม์ๆL.šฃ@eQๆร๕‹!Œ(ุ|™…>.ชลFCHคลยˆฆ๊ฅ๓ZHˆrtัQใjH๛ซๆ‰;I<x๚์/6แ๗_p„yAมWร^๎rŸ:ผUณูj๛i8;ณžณฑั‚ZBIyy]ง‹ueฅ|}๐ž•ˆjฉBa0@MFŽeQ`๑ย๊oGn”ฯ[ฏ^%บnDฆห—‹๕รๆทป6r๛ึึญ˜kRg�KตO ีP—9ผFKNM›Y๏Sิ†S2ฃังฑcๅก:t๙ข๚ีŒjู…๊่UT/ีผย์ฤJF๕ทŸ ีั–|หพUT‚_uข๒cs…สgต่„Rผ๘จ†uw-•แยๅ=$oส|เลนซ๏ผ/๘2aM)zนต๛T้rA ทŠพฃบ  ฝ?2''/ฯฌณ†W'$”•๎ม9†;/VีIb"๊๋P u{“$5ข )…i!q*TjniM้RฮP)กqš}6eZ๓zpผพi{^ฏฟคฉ ŠI7}มจ๖gึน]๙I๒ถp6TdอEa‹๓ฒ@๑ุPจœKหฤOฏ๙๙/~ใศรๅถš๗(0(ฆ1‹|{ <Tใล๖๑๑’์š‹4šฦ~จห…2E#3T€*i)ปPr่ˆˆz)>พฐPโา ศ–๐””Š:œJmm0๔ดา_ŸฯLH@…ษแี:t๑bล้เดๆ๒๒ชำPl:%ๅ๑cษ Eตื˜ะฯ…j ฦj/ว"†!T{ „๓‡็ฟTT฿yๅๅฮ�ีำำZWDนXK „V’O@๕ฑ๊ฌิœœž‚tถดgdะ5…Tgฆ'–—VmЉ8t(==1bk๎าŽ9ำ้V“Bฃบพซ+%ฅต{:ตดจ๐1ช๘าิbจ…*Mฮ]ตชหห{6JฟdTใ8*~ๅrIaaaทฏŸ๘ึซ}@5*ปSญะ.W$@๕6ฏ3†๋ท&๘Ro6YuR้BQ-).อฮฎษหซจ0™Fฯคx€‡j(=œ~ฑ‚B5aฒ‚ฐrc~ฅฌพห‘žำˆK""ฬๆ๘”ผVบBc  j๎งPู_>QXp,%กDธฐpฯJีชฃฃ้์ึ"#ฃผU“_0ช%RecๆๅDW^ฒกRžวw^>L๛โ`Eคฝ|9์eพ€๊55ธิO|A๕ฉS-'sKjzzx๏šPwtdg็ฅ๊ป@}ะ๊ธššฦฦ๒}š37ทฆ&.7ฎฆœ๎;ลดV]’]‚ด๛ฑ–’’ึบำ่้n„๊*”กืูัžSt๚tWGพฺำ'Oึไไ>%ฃน$กlฬ ๖ฅ<๒’ •y~>k‹[ ำมƒน้ฆebhพ๏ีกยฏ฿บฒ•๓Eiต SJ{7ี‡2SSหkUMฆฤฤ^gfujศฑ`ม+#:: {'$SfK{Hd69>อNt2ปCBชซAใจ"™!!ฉฉE๛[9ญก ปHdmm!‘y…D'œฅ๕,ัž •ปV&ชีกกBจŽ Y'จFQb*ซ•—ธ:`k็ƒ฿|ใUฏ~๙ๅีZŒH;็ฮoท๕์มƒฐ0ฬฅฦจะช๏๖;ช;Ž„์๑w:ใB.ึญ๋์ŒŽฎฝPH[F(u๛ฬ™}๛ถŸ๏สศจฉษMอฯ),คQ]๊_W•f#T๋„ v๙๙=O๓ดj„๊LจุœSWื>žš_tบ๊ศ‘ ๖ž/ีวoP.e28xข๗๖ o&m{oพ™{ตBe๘ำŸ fr™ˆc๓๓›^อQ~E่บ|…5\g”๛๘8yจถwทไ็็F8##[[i]g๚ชA๎๋+)iฬฯฎซ๋8า ฝpCuวh~๖๘8T฿<ซ๋>IีR<zุMซฎ?Q[[ชฅฌบ๛dh่แ ๆถvTฺseขzq—[พ๊h€sฎซล3จ,จ†(1ซU๋ชณธฎ~๚ž—๘rช,๎ร๗_V:ฌเรWฏผิ๎ง๗ฆƒ‚\ๆฃฺชšEQ …้ฦGk”kตํํ‘ Ey=๕๕YYๅ๛ฉนใฑCน–ศ†๒ัั’ทอ‰‰ตตํG"YTCC(ืjฎ๎,ษฉช’V:ปฦ3,๙๙ญ]ZuEฏษ41‘yฒ้ใ} ฅ5+๚ืœ}y{พpTหd:(~ไZ็†๘๒ o)๖˜๓๛อsNช๔‰้ฟข"–‡๙ฃน๙ออ'ผ.)^ค&yกXzฝIC`ข…ข:&ฆdGIษ@˜ฎล‘ะะ0ี2ฺXVถึง+ำ๊Q๐ฤŽ๑ายยฬฬŽฦกะา ฌV]Yูื_’ำา’`)?ำ้„Š‚ั,ชYญZฅ3๗ 8€๊ึํ—.ม'‡ญี๙๙UU+ำVใX”‚ ุzๅฉ&’ฎ†M—ฤฦ0ฏTKdZpึysลŠฆงOฝ) เ5ฬฟ$๗๊๛{แ]L้—ฬJRe0‰D G5,ธ7ํฯkkC–ญา์šชชพพขฒVด๎6X ๅŸOžฬ/ญฅํmน๙‚ะลลํY!Ga† vฤกกlพV]3`@†oCfป%ปทท‡่ะœ ‡๛๚สสz๐ุ/ี`œณ6ฑซ์ท\~ๅัmฏTXำผผZช5ัWGป<–๏?๗๊oฟฝuKํภ ลฒB•ญฯำ…๊SMใใจ :P=rจ ~ึvฉฝคไ4ฬยภ–‘qtำตŽ – ๖๘tvEGsZuq๑่‘e iiCˆะPd|(kถV=JA eๅลŽ††–58.U๘ใ้ำ๘ŠDตฟฦญQ$™šส์ฒA9{W‰>ชฅFซUญๆIฑ_ ฺ›Uj-ฐล/&ขฮƒNํีOLผwาท4ียจv:3 wd็ีีนกบ†A๕ใำP๓.ฬฺฌVMต40‘€1ว š#ีnZu๖๘ฌฌฒ2M บงg(+#:็p™3ฬมฟlT+Hณฦฆี๒„๎ัmฏถ@๕Mศไ•ยถห’เphฑๅ Œr๙๓7#sŒ>(กž ี~~([๑“P=:~ L]ะีŸตaXBฮš�ี๛(Tใฃzƒ๊VwTŸ?ฯข๚˜ ีดV}๔hn_ไพš๚๚ฌขฺ”ัพ่่ฒ†ฤKีhXฉจฆT๋” kฉvl๗a๖ จ†IจฅV๐๔jนNGๅm‚B];„R7ฝบ๖ล8‚คผาฉ™œ•ฅ 3ฉง ๑5eQ} กบpซTฺlใx__MYข้t7 ๚1 ฺ‚P}๊T__๔†์ œ๙"&ฆ๛dH>ภูป‹สR.แชC-CฉููUUฐ˜5”˜˜šูWTƒ๚[แํWอGIด(v‘w}ไmขศ&\wไๆ๏จ–›Bโ–…J Iัž??!\๔–อาDฎsํ#F.rFฉdแจ>…P]V†งjc๒*I2ˆิี!T;a …F๕แรณต๊สสŽพ์์๖v˜น5xิชSณ-–ขึV`zHMศ™3qq๛๖๕๗1ึ•UTฏขz๙ฃwก๚$‡๊ขYจฮ๗ีำC๎จNษ^E๕*ช}B๕รBจBปkีก๚#ญ:;’๏†๊๊ฏีษึ,ท$ฤไ’ :–=เ/8ฃผM/`mัK:€๕รk็ฟ�3๕๙๓(๒E8”c฿เ^g”/,<›O ๕—k๗์AZu๙ใบ‚ดฌHั”3€”"[uLŒV›ู•›ำส8AA6พ๑พุuSZZฤฃu๗ ญฌVmIุทฏฎ.ข8๓ฬลฒoŸฃป=!กดดตฐ๎หGต,ฆ„๙้ Zฤขิ๊๋Pw›ฐั`/ไูป้อg[งP, P฿๓ๆฤ ฏฎ'Fฎ ฌsนdJ9([€9ฟฌx |E[๋์ˆฎTfŽๆ8€hJ@j…lี11๖cฆ๔๔Žz5ัƒVผ“ส Oบtdศ’]าิ”jษศ <W2ช•สK4๋’ซ'–ี8น>mj^i;น<sPํ5f๘ีห/ีsDพ์†0ล&*Žั\PigwT็ UญBP9Buรaีฎeล˜™ฬู=n)แกz”Bตู‘๓ ฿สZYญXฝ4"Qฑณฟ?:z฿วtป%Px% ฒก*Q>C$oฤBตW๊ฝ7o๗ถx‚-๚›นผ๔�ีฝฝฎหี*ฉจู…่ .gฝ˜c'/eg๗0จพXู‚_ไฌ็†jฮ�าส9่Cไabขรมข๚#ญšAuLฬษ#Cฅ๙ู%ออ ััี+ีryJHkIMO„F2ษ็Fตl,Išญf’ฟฌึิt๏ลSฏจ†X˜ป/ฯkMwšlชฅฆ&ำ.j˜ฉฏ7ฃนณŸฏSฆฟ‘/\w์~๚ดอฉไส"ab’€…V฿rŸz๔ซn้ˆ+ฉ้ํmjŠ/ฺพ•์๊JMอ;KEน๊ฬษซ=r$;โVฝมะีัX จถืวBโิพrส๒b๑โโpGJb\Piiญ#ญ:ขc JมฏาI-ธ—ูhฯ๋ŠวงWชฅิคFEŠ9{T@ไm9แ}mqdไอ๓๛๒ู.ค๒ๆz›อd"ึ๛- ช1ปขฅฅทu=๎อPีf ท‚ฏ5Dๆ‰w็ฝ{Gn ใ”jนœะXหๅ’OBตD ษ๋m๐ถถ๊œํCŒโ[Y�NคEeแีก๙gฯJ\ZueDDXุž=iM๑๑ํ  >๋AซŽ.)IMจฉอ“HบO๖‡ๆ๏หฑ๛ณKา…Žj฿ยe‰Nˆื๒* เธˆ? ี๐NEjซอฌใ‰๓บญฮ{#ฬ)๋๗๏gKซีQ—~๑โRกบ๛du๚‰DNgวxuzzX˜ห#:ํฝWwjส๕๐ม"ฬฅScZ5ไVb ‹ัๆ–‘-ฉ AAaJฒ>ณฏo฿>&ไ"ฮ3R‹j๚๛๗ํำ ‡.TพืีMMฝ=Aฑ’โโ3hม=ๆ;˜\ผฮydlีดyy€„ ^๊่ัŠSMGฦCC๖็ปBฃฑ๐€๙ จ†๒DPBฟx๑ภภ๕‘ฝ^ถm{โก„—ฝำY]ทฝ"hIdั~ฌitดv0[ู^]Rใึ5ž฿œหKยฏ ๐L‘ฅษj5›ุญ]จ"#๗ฺ้ฐ0pUt!7~ฺ7TR !0๛r4–B€!๎าช# ๊Uชำงํฤ.M{; )๔คU——๗gE€Hฏถ้ ส*+GฯXJ๙L+ีPถ‹5ภ<7=]ฅ#”QFhQa$A๚๙}TKฅ(2fž?kภบฆ้รรQฝ๛ีห—ณ๊ย`๖ๆ.‡รŸธ$SNYffbH|U†eถ8 —่ ~ฎ๕ฤkฝ๋ิศ�๒ ฒ4บฬ$XƒlZ™ไ“Q}์X;,ติl฿–okxQ“ค  ฑ?–8`.ฐ66UW‡”ิ:๓*ชม๓้h+2ง›:ฺa๒J้ฬ8JืฮzCC า๚KํหรdZKVึพ}U{๐j Iฺ4 ๗ผIฤ$™รม ๒W?ฟ๏š…)3[Paาํ=K‚jyA๘xmmาๆก”๏bฑ ใอ๛ŸzTŒ่ๅธVaถš๔๚…ฝ@5kลƒH—๑๑œr$Œ*U๛xHIMำS(SNN „พฦ๚;[P`yฤฑฆ]ป๊๊์Hซฎ็ป<ะ@ซ๎TNซnณXjksGsk` ผณณัRRึp๊ิx„ฯ>~ผโQ-m‹ไล—["CโPNˆธศิ]ป>ช!คWซ6h‚Gื๕aฮ/vxวz>tcตผณณผ\mwŽทŸ=ธ4iแน๑U…iiํีชBbzบก!Œoพxwุ๛ฤ€vจžเถ–ิ4 3 ฮF5Žส์ศสJ€fA+……L-H‡็์Bฉ?* 7žฒ;! H\\yฯ„DาีU^ิณP]หฤ ฃfฯlM๋(สwv&ฦํชš่่(*๊ญStfฦลUึIšฺ‚๑?b!วฯoัQ n :•ษชๆๅ๋€H˜๕j”๎msณ›ลมูq๖,ค*ช]ข9žไษฺฃขๆถฬ๒rย2šXXศ\Ks๓ท'ผst๊ฎ๘๙๑l่A่เ฿ฯ ใ\b*ซ๎G‚ˆdฎ`อุ’cวaๆQJนๅCถฐธ8TPฏAธ?.8–‰ฤณงต ฤ Gฝ์โa6HZSnnkซ3ำษ™š ยsSzZq<ณ%ฅฆ๖๔้ฏีŽe‰jด&๗๐ๅ‹๊`ศ}จฎZ ชw,Tใnจ>”๎ีตซจ^๎จ~2'ชท}จพ๐ตข๒ ศ๕qqก3ขZโโ>ชqน^&ZW2 [Gs„-2ซ‹ผL{โ๎๎ฺ†‰็_\XRญ:จ  .DUีูYTSAฅg‚Lzฏๆบ๘ož=ฝงำ๓L๔bฃฮjา้^…ปี"ˆฉดCFํปฬPฐห๋าฎท/cผl๛W๏rป฿EB5tj๑„_๔ยo•9ย้ก'ž?็"#าLนี……วŽล็\\ZTืŸ<y๔จ2ขe<๑์Y*๋ว7#sู>ถAŽฆ[Dุzžฃื[5„[่S”‚}ฏsTF(๕บ]ปz{ƒชN/†ิฤฤ,)dแ,รฐUT +ึBจพฐ”Z5 บšAu๊‚—wฟ Tฑmyกz๏๒Au-ี๓A๕ท_ช—[[jTใIฆง'ฬส_M๙ZGFzv๖]T#')“ษlๆUษฏ[ืึ๖โู๐ธ=๊๎หkื่ไmmๅๅฝฮ๑๊ณgฑ%ิชซ ไJ๕๖Bฒญ ‚ฒป^CxhP?ป7ค]ว›o๊u0฿”c —=ผP‚H(g,ดผ๊….Jร%7bO" ี8ฎ%ี(zมหJE@ุ"kA๊!ฏ=H‹J—2G0ฤ๊ŒฏYjT๓ ฯม๓cd๏\,'n฿VซทบใๅZฅีชำ๛X1ฮ$“cผJต8.•‰7n”HVž0"i”c<>~~Tร9eฒ๘๘Tหวจ†RๆžK™-ชaˆ�O้Š“ยีjจตธƒZA๔ s‡C5kซm[j[๕๖ย ฺV]pํ=dง๖VwŒA๕ดŽwฟ ลf•ษฆ—~B-Aeำ ์žE&ฺ็@ตงลฟ โั#&ฦ‹‚บw/•พ‰ณUทถถ๊ฦฤช*”ž้ษฆ›m'C5o&*VBยH)/H&–1พq”H‚y๗บ$จ–H">%.2E‡บŠ @u\™์sกš๒g…ล‚+ ฅP”al.๕้ีwฏ]+�O)ฌพ>aฐUUมKู้้บ CWW^กk‘Nํnก/เPD๒’ธษItjฝB๒)‰vฅR,ฺ๘uดเภ@7aQ-ร”ศญL๋*v่uๅส๕๋(ภ|ฏฝH‹ฺ qๆP)•ฅ ๏ฺ•ทTYศ�~ี๖z(ๅฃฑ†งขขผy๛d.GC�๕ศ๕+Wxแ[˜Xฉำ™L[>ฉ5–ŠพqD้อ7บ™C>?ชฉถ.สœ’ซตlmยi‰Œ„ู๕็B5šผ›4&?ms` กป๗๔ู๎น\ภไๅหkitL{\สล]Kิ7@ซึคx!0Jๅ๛‡w†็qมฯž9Z๊L๊iP๔‰ฃ๛ฦเ�ฟu_E๓  t—รลC5,žฅˆTŠ]๏:0(ยAฑžห‘โฤ“ท๗๏ฃXr{ดtจ†๒…(ฆฃB`๒z๎฿๒d๏\ื +ŠPŸ<,Œ ญ^cี้>ฑ8.ู๐uใบ€€`ท”VK†๊ภuฤ.C\\ddj*๒๖JHMŒ IO|ส๐ขCy›า“ฤ๔ƒรรs“๏๎‡๏ฯงุมต,<โ๖%ห›—fŠW!Tื7A Œรัู๙๒๎9วH๑j)]รfT Xเ…†)๒๕jP6—ฌ๙75ตelก{ONMM}7นเ“cณึJี zP๔‚เeR\ฟj-Žœ˜ ี฿๎y๒ๆอ๛๖E}ขฤ๗๙-ชฺzz‚ ”'D˜;แป=>22ใTฝ}ล[5Q:ซ >ฑ’JฌdS๐RJใู0L*๙CPอ˜_”$xVn฿Ž‚Œ๔สญBS๓ลA54นุlฐ๊๘+๏X R้ต0.ฏ่โ๗l%ฏKE๊เy~ดiืฎฝบณ{ื:์…ำ y?ึ ๖šrจV๋ -ŽVๆฟศm uŠA๊็ษม™‹z๐sษ?S‡฿ฒ ู๑ฬj็ไŸ5ตวจnp๐ปOF5Xไt:Aฏๅen……=บu}NTSžo7oRV?.9“*(พ๕bค~๒๛๏dP}๛๖ฃ 7<‘l&ณซ&ฑfฝ๙ ่เเุŠด]ฅจแช'gP;ทิY๔�ีฐž8_T_ ภhTcŸี;ฉSLก฿กŸf๑ุƒ4จืฌูนืžฬ์_\Tหgจ๛”/GTŸ›แฺเิ;];ตูรงSฬ~๎Ÿnf>๔ีฟกง๔;๊๋‹‚j<yจžYlก:Q=๏9๗bกšZy7„œgชVƒƒ๕|k๐ฒg4lŠVื–ิ็ม๒ฑc>c ชค่ิA6>LNฃZŽ)3 R\ส8ƒj82žDธx*ฬุถm^€๗ีqv็ไ…บnแ4ช]ป3Z5}Ÿ๋>ี์ยญzžฏฑ((์สญนฌgฐƒธงpšZใึ~~1b7ฟyอŒ์ฃ7ฑ#›ฦe?ˆ๙๓'^้ePกU`ศ฿:๕rซ[vJpลฒ้}O˜N_ŒoBL๖“ซจ:Q-ง;๋ๅˆ๊๖๏฿{ฑฬr#u™วŸ ีธt3jฉ—,Pœ‚ฦ„HIย๗ๅ'็“EทN;๘ฮหฝัเฺBตq’>์OŸชU/ชัหw็๔q ]3์&ษžv˜\#ˆ๊7OผFยŸ ๗๛็ถฝn?฿๒ ึ~"ช%R๚e> ฝ๘ุ'LหVQ‡ขZ"1ขฐER้švหทnอฬ|๑๔ูผXฝ์ ฟ1๒;ธD–B,"ํแร;w†wฯg<๙4;มศ!Š๎|*พชึหd‹//ฒ๏่ำaเลG๕คŸ'}๘ึn~[K?ไ‰^ไ๙zPœVช“ฦดฤZน็#8ฅ๗% KFฃฺต;…jญ’จ“dQAาO~~rนฺjRฉœ’ ๆึญ{็aูั‹o฿>ฟฯะZ&ย>F๕š"'gกz–^ษYTฬS@ฐA๖(฿๑D~,'NฬแฉB๏รŠ|yวฃ=ิษO$ซ^+๗ฑ/ใ,™y๓—ั/K$]E๕—†j๐hU’แแฉu+กั๛`^จฆณ‚ฬฐ๚šx‰ŒิFrx๗ผŒ,ชกkaZ‚FตŽ0…C‰๘ฯ+ ม~ขO'—ษฐตะ-ฎพ“๛จใ<kทกi}ธอค#ด"_สh`˜Iฅ&ลจNžีr๗ZNญฆPญ ‘ฅ็๊$ก ๚๔Xz‰Do…&็*‰ึ“qจž+ณฦศศ๓็อœ—TณvบฉdืG3F๙lmภ˜•e;}„9„+0ส๘๑ddŽQไหO`$ผ๚ฯห(๒ลีPZมช!Eพ๊ ๏B_ข |q™| ฝฌ1นlี_ชฅrญษคำ๑สp Ÿ=’Š…™—dวณคu (-K.ZำสๅณP}๎๓ฒS๏fP€นPm…8MึuŸใอศiTฟ3ย uke:(Eๅ#Uส์iญ”ฦฮ9ซษLhE>jีญ2klช%)IฃZhภeFี ฮฟกฺจ$ฬVญFEQขE@ตB:&I๒,rL,ฬ‰yฌ.ข๕ล7฿4ณšฑ‚†โŒXก$ษต฿1rzŽช$ฝีฤ,‘#tช_s฿œcอOฎ์9"PชฝPคฺๅหฟพ๙๕๒ฎ?z๔Ž้,2:Hั้Oด>—ฝลEฬhข˜K"2บต"$”’UTqจฆrปk *Rษ๗‰ ซh{๐bวแ*ๆณ๕VบOpkฺ”มา,JณฺTณŠšFœฟ6Goุ๚๋ร/Tƒ$W่iT;*B๛Yโoeโs4ชแA ๐๖ซœต{O%ŒuาK‘>๗4 FO|mPปP‹{šOำ›$กCใ"-jๅlTซ4แT๑=hใข๔8H…aณ)๙z5†’ข^Gฆเ๙เ๚ํ๛\ฌ6 ลมpGu\nnฎƒf[2ศ”FรG๕T|๘,ก388T_5kI6ฬp{œSธPอo็AjิำžูO1‡ Mƒa]ฐ๏ไ”ˆด ชๅ>กz!BนŠ๊ๅ‚jฅาŠด"ž…088(ฬ๙�Jxอƒิ฿‹h๊/j")—ม้ส`&wž๓7PMG๙เ๊ ณ~ฃ…ิ็`Iƒ[›|๋\?้mzฝRษซlQp๊ะ^Qk†๗?็ม0๒~๛ว?า†๔มษษIชใ•เล5่๎๓Œƒ4|๘o%5ดVพพy'ไษ๑ฺV&ๆดj™x-.]ษ…Uธทx:ไุ$cซžใ_ุ$m'"๑_๋ฯยvŒ:ท‡K†#๒๐cP๖_ปVN+p๔r;MNาจžœ›tญpบ๎อ…jนt'}ม€jxี„ฆPr)จžd๏hฬNy7ษmรถษ1'kวึ‚๙J˜Sz๕ฺ)t อWฎFฑ0{Ÿ ฦจฐOธ_NP?มฟฟ๏๒›ชIีS‰้นนะ44gอ Zแ่ผLา8โไNcˆOIๆคzs8๛ก ๏cชืnž๚๛ิ๏tฉี'ุซzWรธRปํ๒“'#ืŸผน๕hำZๆMพC")WชLœพO9]ƒzsƒc,ช•\‘?๋š๕X้฿ึŠ@(aล{ญ‘Sฤืำ{_E๕2B5ฌ6z•มฆTบGb)‰{๗žอณอ?hูฅค๚'$ภjUœ‚โใงฎ2rt.Z<ญฃฤัืq*๊_ป1ฝ)ี\๛ฯ8††TJํฌๅ๙ฟ๚ฟ(X›๚๙๏ฬU๙FJ1ƒ๊ {2ฮถฐZ”๋Cfy๕f๖่Œ:๘ต€ŽัFซ6‚ญš13X๘IŽ?ศฟ`yf๘Ÿฯะ)y/™†.oo7[-Mู๊;๓•ฬ™Y$๙e�aQ๓๙๋IคUkI๑$ุช_ำ!6?%๓Ÿ œ˜›<๎a๖ณœdV๏่FŸใ$<c›นkœยไ๊+ทฎlฃ฿1ฟRฟฦ๚,ฏ๙๖7๔Z~ฟ™u12จ๎FhVยPBV–…^%sใrC’_ๅ&d%าง ษsoน๔ฝP๗ษ~)ฅ~ฃ๖ภ ีkgX_๗ฟ?a ;%’฿>a…“2๕kกเ‹d่ธkเwฟศd๚)๗เ๎9๖š}๎จvฝฎŸ\๕ณฝฯNF(“Xกไ<๕yฏjึ{_E๕สA5ีOฎาFja‘Fu8ฟ๓'ซ@าiq‰ฅลžUœ‰žOบึxv2Bล๊ค;ช้EฒทมoHฆ7ๅษฟปกZษ ๚๘l(๑ผŽ)7 เf\.rฏ?zp“ษ๎€รฅœDฦx€ฌมhฃ3Ÿตษ“.:บwC5.„jษ์sเ_๒`าฌฝqwTใณ๎๗ธ?็ฮ{*“ฏg}ยข๚๋AI‚ไเB๗~eิzัkš7?ฯ~’ฎc}H๚hุฃo„™ใะCŸัค"ๅn๏drbNTำฟชๅ์z ƒ๊อฟdคE๖ %ะ๑CBา‡�AT‡P—<Hํ`>ฃ๖ฆq$$u’อ?๓ฎ๑w๚ฒ(™๛๐U๎า)VoฃQMอBตส`๕${๔A3ๆึษวธ7•D?+’B๕lQddhQฃ_o’ฤส5–๑๘๑{_E๕2B5JdกPซภgฤA`uq๚้A†iภA{ฉแ/.2Qฅ^›ไ๎"ฅUาš‰ฺjชฅƒRIภ—๘ษญ[ตZใค๛“†H‡+h yึชฯ` 1k฿7.{หFZ’Vแฏ๒>๙1ฉ™‚K้Ÿ?ุEj๗k•Hส@๘จตTl7.Mš}A\2๕TiC๒,Tใ,ำ\(ฃฤ•ษ.‹ด๔#Tป฿๏k๓คูC๛#žqกšyไWอก:(๘๕์w™์้๑ฒg`๓ƒฎฟ฿d…ษjš™uƒ๋HX]๔†j๚ฝฝ™3sณAซYญื๋Aƒ=ฮฌ+*IตIc'™eERหo[!%-ึ”� *ตF๘Z‰Lข‡C2๋'๏๏๊wชฏ๒„์_hต๓:=Œ)œR’4•vฦƒ์ัKผฬ“ใฏ0%อ~–JสVaึ๋ย™e่Aด/NKๅqV(“(๛ววโ๋๏้ฝฏขzYกวzฐD€›วRT8X{wูA๋ฏ็ยU”pBjั„D=IอษS[Ž'1+ŽZตลสœMหั;…b-ง9ปœ\aeœฑฌIJb๕„ฤ=ฉฎฒ๚/Vฝ_๓o—|งคคซฬั“’” ช๙'K–๐อฬฦhฺˆKE8เพฑซw?ุฯc8ทฌี”_ิฌ ช‹’>:พTถ…มœ•["d?‡“!๊;๗UŠผKฆ-/bR๗ัQฅ๘ิฌง$ฒd&ƒ2Ÿ™๕ vrถjm\•€Dษ@ขึฟžฝมšต่อ~๊`ย‘ธ–บ™›Gˆbๅยคู9๋PIQQอ ‡jŒCตZ)–หมญP๗YC)ณJeRั๑ซƒคqVH€– g‰&zฎˆพฅ{ŽำKฦ[•ขษ$w!]๓Oี”ฑิjีJํN›L6Tณe บ˜“ผe`.Š{ยฐฬ+๑๘uมcฅHI3ž“3 ษ�w(—๘๒t ืVQฝผPฌฌ ]ฉ0บ…ผฮๅตทcว฿ฉ7nงeจู•gำj'`h%TIZ%มLษ@`ŒL: ‚dPผVeยh1–ห˜ุ…คI›UNwฏฉกD#ใ`"WะG๚๐๒๗iyอ๛฿†ฏฒะfŒ!ษV“ษJ์v‚bฅ3‡ณๆตŽั๑^‹sšสŒRefบfpจจมฺ๕:ำŸึ๒Yอh€Icf•”พ๒ใชE2F๕G^ฬธ๋๔น~^ ‹๑I๑อ ;ืสก,/}ุ-fฝRฬ๖Q) CGฯ&ม‡C‹I™จณ)ฅYตๅ*“ย ฬ/P๔แCปž ใฉฆอIIฐ๘iFzผถ0!bRฏข{1u|ษีฯฏ~งR1*Y*bœ๕ฎn1๊tฬ#{g4*[5ธด)˜ฮ?ฺ่`0ยLลแA™YฯŒk‘ฑos-ฬ ‚1žฯ€Ÿ5๛zึ)‰G4ช/Sึ_ี—ฟฝฬก๚รฟ>L)ลiีpG Sb%ํ\ณศ —ญW๋ี:ูจŽงมๅิํoขๅimHฎ™ ๚ฐึชi~อ๊ฯ฿^fP๛_'-ปฟ\ฟ}‹ะ…‰•nํlั@ฒ'•ปt‘ไคI—ปm8ฃ4๋ถ04ๆใซ฿ม๐ร&yำC่ฯเ+*‘1'หi_์$6รŠฏJ%ฅ_์qœ jฝ:)7iนJฦWQฝฬP +z=๘aZ7‘ hrƒ๔M;QM ฬqpeข๛มw)…R‡ัฏ|’๒qขAJช้ล˜œ&yฒNMะ*U’อ#:ช””ฏu†ไ„t…–ี–hIพ๓ฟจั]ใ๏๛฿hU๚็?ธำfฒi่ฎตYcาูlดe2‰A4ู่cœƒGฬTัdƒœ9๔ภ๒3X๕Œ=i_ึืฬฦ|ู ?รl6๐.ฃป…ิ…jŒu{ฟ(FW'4›iŒ๑ลรI๑m์๑ล BE_๐“Ždื้q)ฆะซTƒg4ะ–~ …6ฦh ‘` vmR™๕ ฆ‡Kdภ}2+bๆrx;o'pS2ณ‰^)g<ท˜ะ&๔๛[‹1Z๕O*tม๔Uฮhต jIเšฌค7˜BOฬ6ษฬนqvH“P "cํเยpะ@ย�UŠK›ะj™kDž#NฤbฅŠA๕e>ช/ณจ?ฟGsลxk$ท๐I,‰–ฏใ”’ญU(•$!๑ŒjฬH฿ี‡๐อฌ*ฆE{'ัฌKMeAฬFรร;^ณj5ƒ๊฿(็<ฦ|คfB=กVY้CHชซuJž์ูD๔}J%ฌ์ะ/R๋rœfD๕8ชIE‹*ฒU3ขธ^–ีD?aึPN โC?tBkค‡ล$$”.๑ตูX—zlถ)–๒UT/T๛K xะ•ลnqฝJขํมƒgฯ<วฒ&็L*ใ —nPหie๙ๅชฏฑs$ก&่qฺˆ‰้.ดEลขzฺ0œ๎๊“b9้qๅ&Eษ^Xภ๕„{?ขHฟฃŽ๚€๊—ดdว๐ณฟำฬT[YTkภีม™€แฬ’dฝฅรCฌศŸืja>–ำ;NaJ+B[๘SQZ7Mถj@ช5ด1œก~โPญๅ"˜PA9}zลH„ัูษจ๘‰•™๎o1Brี*ชม-Zหกฺ(3nาp@๘_รจข2น’"|จโกq˜C5ั~hฬR7ดv&6PผๅŒImac {Sะฏ€ DM?ฅVฉ็PMา˜จ'ฆgฮJ˜ู๗Np‡๗มื|TkiนIคŒ\�ช้kLLŒg%`อwFฅ™A๕6Oจ–c…`.—„>^R2ีX#บP ๑เ#ช%q๏จN2่ฎาŒถูm6ฐจถhh”mF"๎8ฯšfTPจ•๔๖ฃ+์Sา›a’T;ย๕ZๆAฃ็์’=LหJŒฝHีlะฉž%<bฮ„ล่ รƒงžๆ”–Tะ&I›ํ`PอXซP2โ ๛h˜+Zห|˜DK†ๆ*g์^E๕ฒB5ฬTIาf€XทT’พ‰hบwฯsฬษŽ;ดรjึ1Zูีศ C๛Yส@#u"$˜…g œtŸ–๋๔,ช)ัcB ึดlƒX˜ษใจ%ฦฅXM๔1ณำOŸ๏฿€ีด27ฮ๒ทง/1T้ฬŒ’บSฎq$าใPช*2")=ฌผก้ํY๎Wมญq๓โR$kิ„๖"จk๔วŒœVอv7%˜f.Gฅ2ซlิM~€้8ƒj๑ตZv๎ฑbUไฌEิ,’1€Œ™๕คVณ๗ๆ1mฅiขทHด42^„Lวุ&v"ปผ€1ฦ`$81ึ`Yรށฐ [pH€�ฐ“Pำda Iช *SQN:7โฃ5ฅฬL ฉ๎ฬ73ล•’ชน-Uš?ฎtป๗~฿๗<๏9ว$ชสbศy{ ˜sŽฯ๒ผฟ๓ผฯJ/(ฯcฎDL9ษ>มฌกpš$(UฆršฑnH๙|๚zฉษฃ8ฃVศLด2lฤt ย<89“<‡\-ีิ‡yิW)ภ@ํง‘ษBจึเ^tมY‘ˆาิ๘pNะสโษ.$"–j>กย๕„๔bALก฿W้ำa|>mWกCx๓Oุ|ช๛ำ๘o๑EŠaาž< ฑ:ภi้ซbiโKPอ„ าkย[b.Ÿœ›ž~ฉ~๊ดYจ“ี st#-แd๖ฃ๚ฬฏ!ำ‘A5ผiˆืคี‹ฃžEH๖hๅ—zaญZภ!/ึ@TแT‹>ฅEXžGฟ|iฯ่ސ๓ ๕„จฆ๗๙"Uƒ–_๕แj*P๚Vศข:๎P˜(•สU ้๒#๕๊Ln†P/ุrqŸไ/O๓L ;JMM่TซeŒทไฬƒ89ชศgข“rีง)5ษdง่ ™๔ฺMJ†spา็ม๚R'Wบ*]๛PฯภgฦZฟแG๒ำฃ฿+5uฯยYษhำ๏Yดพsจ่ Z™ŒฑBq:=.\:ŒF Sษ/™๐ฦaนญ p๚ๅ€…Eฆ๏G5ไJะFžOจ๑ตšืSฉอg�ฝแใซแc๚2 ?zฝžฝ%“IOาฆ<eฅ‰zi<เ0งœg‚Œฦ่!ยOำณUยSwไ๚tจ?ภ$fดc 5]A๎:u|9(YเฦงQmข>ค+_I๗ฃZฑDoRฦฌGyผ‘สXญณ๎ดด†C-พ…๕m&‚%`#GC}ผจ+6฿‡๊๓?๔฿B,G(P/;�ี฿Aถ—šK…8Ejีb!ฑำ"Kป”DOยhฮ่TืT;(lช@F•šผQJอ8ี๒0ชัXMี/}2ฮ$5R๖Tจ•่\]ก ฎ“อ•&ี|uภ3‘O๔[x้ŸคหMqฉXvXL๐T‹iฉฟโ-ำjศ#†ัแ๐XTวชy<5ƒoQ๕r PzzU้?๎3Yๅ_Š^ฑšgด YU�™""z่ ฌๆต ฅษ#j๏ƒk ๎น,ชŠjฎ˜dส<U5 ชŠจดฅ,T๙|:A๋ตปTyQจ>=๕ศ�Qวขๆ@5mเŒ`bะะ9,Z mฃัJัFgฒ๑i๙<‰J ศ9~ห็+"6ฆ็wกฤ0 ็ษ:!ŽK)ฯร|HTKฅ‡{๋�Nอ ”XพZ๖ณ›XMAYชญีด้f&ใuฝฅฤ}ฅZ!]†›A5\ทD.ธฦCฅœ"2œ!‡๛ัณ9๏ˆ3ฬ&"}KเจkTK๔4ช†กง|9ชa‹z๔j1Ÿ~%ก>ฏVŠฑUcmuฯ?กŸฤ=ฅTOู‘Nบ,>Ÿ พž:„”F๕'Eฟ๛ฟฟŽE๕้๏l3๙ฺณ๛j5 tŒ‰Z8หU๙”๘๕\”กv™’B๏ซ๎ก]†<1QK(พž๕Mาจ.ณQน‹g Dส4tlแcP ?ภ๘๕ฅАE_+UKLดไh๙ฬณ�ูำ“j*”%(DTPpค‘RDว๚รƒ;Zีโ๋ฅ‚ฏT<ขje์bๆ 3"„k4 #พ•ท:#ฒจ> จฆคๅ[xร(ฃGปฮจ–k"ๅ็t"ฎJตr"ฯ(?สƒ^็ ชAต4hB็2จV่๙Rจ‚gฉจ�ญz?ชฟ๚ฏ �1! ิซ€ถฟ`ส3J๊ จSฦrzีŽ^" CGฆยhVB‘XA้Ÿg๔ ชacS๗็;พ0cFห:ฬ{$[@| ๊ฃ๛ตj…X|�!‘ะจฦCว‡ฟp I”“รงQ U๕„tฌใงP Dqดา Kฟ]$pยˆh\m?ญ€yฯนwชล ภ๔ษl‚ท!*šฐV Žg(ฌ๔W)สXTใ\zƒ3ภ๚•$มjƒ๔ญ:"๖Hช!r๑w”฿๒2ƒF5z `6กoอO*D๕๙ำ฿CˆNว ช1๐ฦทNn‚v€nำ?‡j ƒjนม๗ฅ}’฿ต“ีY>ๆ$๗ฅยt}ชกb j™„‚lE่๘r’~zp›่-#RชคeฑS€šภๅDฦ5 EดเsกLฯp�a%ŒไJZ`Eฏีp›ย7?†.‚๘JD5_ฤข:Pฅอฤ(ด$—GWณใB™Y๘ฃLึป:�B้ะ�20Yๆzp:"ƒU*zฉ ‘—๋ป^๗ย*•n~=ุSบผOัhbผ‘šb๖c3ƒฅำ+fkuตVq�ชƒฟ_0จFญ๚P๏�J๗๘ํzZปง“)8 }ก`(š4ีŒ'สAˆ^1๔ฦ๐1|บีดZrB‚ฅฉ“H์—"#CBƒ6ŸŸLฯ$™$ใ ญ–!4’9iI ช%โิ ๆฉเ๐ ิ|ี๐yfณ"9M˜–$ฅV๑€ดช D๎,LKฆตjErfZ๒Aจ†Sgฤ๙ฐษ-ีษ™ขLผ6ญV‘ฏฆI ่ ก:ฌUำ XeUHอแ>R‘.?ศภ< E8๏ลjี{ิ+TL=ƒ0่ซf�็2ฅmส!]^&๛รobP}ใU(7 _v–.ื4:>ทป;ฟฐปํฌ฿TรtแD้ยSํเ๚๘Nฅ฿ธดิัฑ–Š{^ž^ ,ัญUหฅไ„')/ภ๊*๐hfPM|”Pณ€๚oยจ่JXTkมฮaก|s;พCฯ!ส#๚žัจฦ x3\ภฅึO0่Cภ,z๕Aจ/๕N8-%—๒ภคHNๅ3Yย,าI Bษ”๘Jฅ฿ฤค(AŒŸม๛ฐQอƒฺŠ • Zy๓ฃ BaYUŒw๑฿Ÿ@่[‹IมW”N–”,๔ๅzภคhˆนzฉf’R{)๓บห๖|4ช/ฌ.wQ’rygƒฒ`ปทีKYžม…ฤgwวขZ;๛๛‹ฟ๘#uฟT3ๅ‡@นฑaสƒฎ๘)j…Dศx !T b:าvั๋j4ส ล็j†๋ืฺXฯ˜E4ฮเ`ว…ฉI๙‰$#9‰Aต$9ƒAuพ„ŽgแBๆ O˜™œ/อOjeZี™iฉ!T'%ๅ3GHM†Gh“Oแsฎš24žย<ฆJh]KJ{>QdD๎ #3„๊Œฬฬ|zsu:pๆb"?Ÿ™ลษ™ฉดห”?3)#_*ษ‡ bส5 B$ŽFu˜ๅจว3สไZก‚)†fำ๕pฝ B[@hณŽDฌงO@ย•)aUE_—LFฃ[ูฟรT฿ร?D;๕ดV…ediyllaawฬฉ &’‹—KKJ*ํT๘ๆ๕็๓๋œ฿?–Dกบ,„๊'xZnQhW๗Bจv@Œธฤถmดญ๚ฟ—ฟT[๖ฃZซu ฃšพN5฿ "d/ดย‰ข}S?Aฒ๓˜#ฐฎ|ŽO‚<(ฝDš‘สSHคtศบฉ”&e2๏c™$›ณl�1ˆo†$[’ŸOฃ\ํ<๎ฮL–€9‰‡0ร๑มฃ/๒ษ๓ˆ็YฅWCฺภฤฦํ*ิSเŸN€jศาP๐%Aน ฦฦ)*Z4‘+๎ ฎœ e�0ดฝY4ทz�ช'V๎Wฮ uVn๕uผw๏ฃ|๛ตjูล๘ ˜@จส~ใฟใึh๘„>ม….L!ฺญจs _ขP-•pi๛(1เ:(%กรจๆ‡QองƒU$qjBยG๗เ$OๅำJI™”vำๅVฆyDปค  Bฌ๊•&ฦ0œBฮฟCbาsH‘!NŒ[Q‘Ÿฎะ฿พฐtฆ(‘VK[Bด๙ โจ‘ กŠะ[9]‘ ๚trH„$žz}•ฬข ฌคะ)S'ˆS“Rศต๑$ฒpิ4"QอฤUฃฺBตTO*@ผน๛ตjฬพข, Tฎบท๘”™n>7I!ง.ฟะ2จ–ฉ“’dšปฑจ^Œใ` ื-+ซซYY.฿๊^™ฟ>?w:+*Jฉ ส๖Œ›‹‹fs็`vชgหOO0็vฺgู‹@5u]\D5—๑<„Pื฿แืฟ6ฤข|คL”61ืIŒ ก๗˜4TW%บต€K}หจU@เีt;ฤ จ'jมJ™ %Cฎไ‡<ฅ"=]ข )๗”}ก ฒ’pวqฝ>ำaํa๊@:นLš,Žว‘šี6๘D5J3RไRIlkŒŒŒชชgีฟ๚ง‘o1๕ฌjeตไ}บะ2—\ †ทฺพ6ป๔"ีซ4ชƒ#CYฎ†:;วw๚ศz๑๏ยZ5'„jImํฏ~Eeถ฿๙—ฏ'Ta๙]qฃ(™ต<เ#ŒjXЇดj:๎Q"าCภฅcปฅ‘จ‰CถไpŒ=9e @gคฃ๗ข฿ 'C6_˜ดtเ/๎’(q(<!ทจยจaŠ”v[ž„bฏฒ์ำSย#]ชeœQาtˆฝฃvZ)‰พเEUš่Eไฎธท‚ฒ‚Bฌ|)โt,p:R †ะล๔!FA"ก7y฿•’B;JีŒ{นญYฮ„ฅŸ‘ช_ะ Š‚ˆ7ก>ีฃ# ˆภ!f’œเ™ ไํฒปจฆ)jฐศัoล0ชo)๘่เhีชฅฝ’šนi๎EYนŸ2qTํ์”—ฏ)(yผ^2ๆ|pbbwท๙JKชซ;ๆ_ฬ…าแ]–0ช้์NB/อ3„๊๗๏ฏอf3พU™”q+B’%F5Qอ\gbธ#ฺ-“*‰.+-ำฏฝ[ีL4(8)/‘Œไ‘`…ค~8,Hยฝพหำเƒ =,:N ไ#2ษต”\=’Se_-ŽใฬˆŠ‘ฆ๘๐สเQ-A”tŽ\ตฒŸœ ใฟ ้i๘—ฟ๚๗ฃ็#ฆำ.‡dPp้ €๊ :=„/–๖•„สDไŽm;6็W-Œญ:Œ๊žัฑกoฉํๆๆฅ็FJฆ|v_ŒV ฦ€ยโงำ]ื?๋—ฅรฉ๕Dj )่ธ๊/คฐb:XซfX๒ 1€ะ)hเฉ@x๛ ˆjฺม$INJS็›" ƒ–Au8`๐tJ‰ง@––ฮย„™ a"@pNำ๑[2IJค81A(ทเspฺ^ง ฑ๚;:"LFuJด,ฆKT+าร_DžŽ๊๎# ส“าณ๘‘R วืะ’ฆ$ˆ(8 คฺ0ชโืึชีR*F๚๏๎ ฑœีƒุธjฒBQ˜Bหก[˜/หgž ุIฤtDih‡I-q�ีษt™™(TฟDซ.]Y- dฒ๑็๓ๅ]bDunี๓น@`M1L์ฑŽkรร€๊๓ัจžฉ_zพสศ์ฺศh$ช)๘ด�BวrCีฟ•ญๅำ)x3จถ€RMG€šๆก๋Œ–=้มจๆาŠoATy๚๕†แ%ta9fฎไ@Bห;oteจRH ๊ต„Pญ•3โ›�˜.P"ฃฃ?h)I=‹๑š Jˆโo๐“ฤ™๛ Q฿ „PaJซscrธงํwŽก ฟท฿P‚ ี \?จ กg/๔๚า^นŸ6“ชล[ใ}ๅLค๋้๖'{%%ฮš๊ญฺI๑F้“'RบXG}YCaซฆSษ รๆ.็3ฺฅ๒๛้ห3คJร™๛ึพ๐Q ง?‚ย๊ขZยคuโ{‰w้ž'ar…| U‡ ‘Z5•d๗่‹Dฮ]ŠQ฿†ฃขๆ}ฆญœŠ\<}2Qซ๔m_กmีจ!๒C=_JOุ{w๏2;Rฦy๙Œ๒๎†*&฿V2ถjuLซ@xน…‚๕ฤRญ์4s:JงŸำ”cฺฺzš Hด๔๑แำืvBบBญ_iซฦ –#ช้wึ้/๎=มT ‰ +�]ชZŽฐแา77๒™| 3hล‡{โปL‘็{๛ื4ช?•ฦ๔๖ิ+iTWญ์•๕๗Kิ[;๓5ๅ่/ฯ-xฑี•-ข„+kปใ›ฯ>๋ธ:…๊๎™ษ๑eš‰?์ฮ-e ปiุ>ก๙t™฿๕฿ะจส๘P†CซUป z%s๚ฃปwธฮ“จ&„’ cPญm~‹ฉ” ฑU2]๊คT™Nฮๅ;)๚i่ค3<w‡‡ยลOใbˆC—๛๘%็ำo้yก`ไ๊๔I=ˆu ต๘uทฑ#!=!ยยข๚Uจฆ„๒ *ีะ#WLด‚งี (๐ลYฺฏxย”ีFฅ#๛Q]Fต3ฆnๆiฉkŸ[1r็ฟ| จฉ›h€$@ทOฺๆฤnEHPฦฦD@–Z}ื๕ยผhbยYR- กZอœ$ยLž๘(ๆ๎ฉฅ‘จ–F Z>แHT+"P Ab}๕Ÿ@อ&@Bกๆพีก2#‘ง๑9ฒaงฟl฿๑)alี ŒV8ะ�ยhี([ตD+ฺg#‹าชI์Sจ๕–Eพ๏™œnwh4ฺม4จŽีชCช๑ฝฒฆฆล— ๚; ีS/Au#๕๔>BTgE Z๋ชQ๖oยจ2Jd๛PญTsรVบื๙d่„ดj./บLZป?„โešุ(ปGw ˜Mฬ“BNB๊CฆCTนฤŠ/ฌ๗=wLิฑจŽ_T“t<ฉ‚Zๅ ~l7็LNํว๏~๗›‹g่e(`‡u …œ๒k=‚“ปbขมดฅ—ฬ๎อvZฏ*]hิ—๗hผ Q=D‰mขๆล‹ฑจผฒมz‘‡›(๛%‡ƒ‰^2pแ่๒4ygยจf่ acยpฐž: xzgฦ‹1syผทb8ฤ *|GŸจCจ–0จ†ช@บBOฌ๊HT‡ฺ•T+ฯ„jqีz2Uั๏ฒ4rmี1 ธนจๆรM2ๅฤLศO๔a,IŸiTั฿ฅฒ๛๓ึSพฤVาชก(cq‰<\ชA‹fฺฮR‹ฮ`R์3ับ|>_Ž#โ–S๖]0๘฿?eดj๎มช‘ี…T—"ชฅฑZ๕n=ƒ๊ีO่ฬูแ/—†จ{1?66ถพ W ํฃ…DŽแ๘ฏ‹ดœช 9~'2ัˆ๊ืษEู“จUCt–LC์ € *‰•`xr๑๕ฎกตไ_เQฑปhีฐ‹*บฦ๕Gp–Z“j฿ฤœ8\.ธ๓YTฟ ีA๕ะ๕K๙เ"ƒภ[™Rฉ‘ำ•ƒฎCึ'ช ไ๒„ี์ฎhงฆีหหม0ช‰ญ:ีCึˆnง‰)0ฑZuจX๕/NO`dถจf, ` †๚y*Duจj Šฒ�Ÿw=*่฿�๙L๊Ÿ$า^ท๓ jื”มณGgั>xชม ื ขj๗ฃมAึชCจ–"ชน �ND‡jœƒyบศSฤI๚’D šO บOฃบภBฦโ?T �^.†ศใ?๚nง"„jAขPJท"ชŠPถ"”๑๋ ฃUG 4hัด]ƒQูศnSNิ3ั๛|Ÿ#ฯข๘ฃ{ฑจ~ฉญ๚eจŽ1€€V}�ช/ฏ ‡ส'@๊๒0ชะŒCูช่Sืจ†„iีฒ(T๓…P-3EหžeOTƒI#wนNg+‚Eพฏฟ๛Vd๕E[Œ XE$kีXmQ๑บt1สี‰ำQbQจE $œ4ุƒ6บexq๑o~SK2ฮƒ@าP3เ|V-฿ ๕ผ‹้าชvปซ}a•šซซ55|๘๓ศ,J๗L ๎์Œ m72=ˆ]ืภ๎aญ:’s. U: %xฤI๔Hก<“*0 "S๗ฃH›†(Œjเ„<‡ �~V…IฎX๚Jท"1ฐสUฟŒ8GCชC fซ็่,'่๑่0+KรZ5„ฑดฯ฿ iีญAอ˜a๙ƒlี"2U–PŸ”3w-๘ๅj&ฎZ๖r[ต„,หMะกž™‘ˆ40๑…•Cท๚:#ดจtฆ}มตฮj.–ี|ตญ:l�fx(9ts‘nbด๊(A VCššชฏชจg^Sนแr™่ซ>รU1ฎุเษmีaT'Ÿฯuuๅๆ‚[ฑหOษrีฮD€ฌ…"@์1 4ชฯญ๕L>yˆ็qwoolฌฉA(ฑ*OรSenใu0BAž_ำ๕k c”้ป ีs|tิ:Zwฆsฦ]= Qฌ์qB๙฿˜ถ๕ไถPO้ัuบƒดƒท/Jp่T@›V“้  - ฿ษ™๐o&vJMD่Dด๘JเC฿๒(ำ0”J[ฝŽคชสแ.สNวฐNNfQMkŽ(ช3ศd}ž…ดLHฆฦJJม‰„`@:ข&Gท›U้3ศดUซOutŸ=y2QcA’ศJซ\ฎ๖สฒy"“ซซ๋๋"ฮโNูฑFทCฅ้ATฒ††ฬทRถ5จฎq.•ZZOฺlv่@gฏUŸึๅไ={โฎษ‚$ัSแญšณTa•โ†กF pุ Rz๖ไ .˜'4„จฅP z”‘R?<–[สนu๏ไษ{2จf†ลฬ ฒnlะRqีdc๔xEคzฃ6๎๓i๎ž={6ชึคฆ๎ ่๘`ถ6ๅปฉฤRฌึQ›jI๑*‰งŠEส๐ิTY‰'`ด่๒05ภฆฒ(n8{Oกั . Gึ‘™ฬฎยUAXC๖ฉ'ศอ#eำ่C๎ำ„จƒ’“มพ`’„pžœDะ’bzิใผ{โฤษป2lh…›h๎~ [h,$๖ ]จt>‡ S`€ฤpwt–<DตA๑ท9ˆj`2œ ขM๙ใ+วpPก๎๎]]Y๏;~””TœฏHซ&1“d'ธๅฟ$ฯŽ ๗ บ>!W/แๆศ šบณแVใc…หิฤธ๙ฺœ๖ํm AตXŒจ๎gP มzณk+/ Ditบdฬ๘๙Ltฐ(ัk’ฺั'O†.Yฝห{{Ccฝ๕๐TแI•ู,`.ภงช†๘ฉ^Gnt๖’ip&`ลZcpฎฎvŸ vรDYT (‘ไ`ฑถbฎ“< จzว•เ3(ี˜4UสปgO“R5+แv“$sธ[NๅžXE*งŠIมnธ3H>7JฐไZBโKๆ1ม่๊ฦF*%99‘… _52ง์ฦอ–lี๏ีเ]„ฅ0Gษ๔XW‘พŒIIj~ Y6@ต"80น;v,หใ๕บ]]๛Rฅื!S@ํผข ะพดdk,*ZZ^(�‰5”[ฑfตฤึhฌOO๏ู••วทBมมzงI„ ิ"PGจๅ8ิ๙Qdจย€วสยs]Šei ฌ$Iqฦตค!ษ'"=Vไคd0”Yฯ! ‰ฎs๔ฦ๐>‹"+(เ;TชN‡UซƒฅJทฃฤ๗|*SCp‹cำAถ‚†๙hยช=จธ"z%รSปหX“J‚ฆd`B(ห Fhี0ํ๑nใิแขfœท๔do{AŠ๏P๛Aซ0~ฅๆ Eฅ!ต˜ฤซ™ก"๓‘‹{cปA˜ณจ^!^ร›ศฉ สS๙, †M#Lr๐-ŽNS— +B๎$’ ดผ}Pฒˆก6`์บ6ะ ๕1จฆKฒœ็A๐Lเ ๒Hมl“ัๆ๋A;uAE~–Fล่PxGแ[%ย9J๘ขXT{wท๑—bย‹N7_f์์vนŠM‹ฃNง=ฟWR^>Y:ทฺW๏//ฏnIกQ=ถ๋q๎๎ฺ๋ฏๅO>}zพัฝ๔bu{ปณSžGj๚–ูt`pย{u“๘๔ฌ�๎A‰k$#XุI,ซE…แ๋p;ฐ>๒–<4๔๋$ขกf’dLˆฆz๊ๆลดˆC™3!ฺฑไ:‹o}ฌ=Œเ%ฆ#/61'ทP/QทลBี=กไ@ฎko๗6_S“/ฮ‹<{RVข}๚ไซฏผDƒ’ŠรษkPs|ผั1ุยข๚=กk‚�€(yา}‹jœ๐จD…—\TJlvŸ\![:fs.,บœนง{5ถ6.'๗โ$Y\X„Uปฝdืำั๒ึCฒปVvv‡ ๗๗๒ๅ1g}่ศร‡5vฃหI(p)UpXฌฆ’ธๅํูEŒ�b(j/G๛œ Jญk(–ชƒvั&ฅ”,็Iซ=rœ@"(ฑ�๚‘<zcPUขz �ŽะฮBFNTฑคtฺi๎hฎ ˜‚ุ  งgดฯ์6sUa bช๖ ๙~๑7ฟy|gป&PAฝpp T4~#ดj@{N_๒jๆ>~๖ฌนY‹eจนb<cT„ผVฑ”ฉœ^{ˆ๑rฉ:โฬ้€ ืโ9น๑๔ภšEf2น6ฌฟe›  ญ—ุ๋�พ c๏AูฦOq'ิลM˜ๅ Pฏ?*บฐโW๒ญบ9ภอฅ"ฤภd]ˆd๕~RI'่มอีSํ๓่g‚…yz…ลg๏ซtน�Gy€85ด%ม)ไPT‰Fตฬเฺ…ณ—๖L@ƒพ>ณนฃฎๅห/!Š๚LOี๊๊‚วถmซw”[ใ๓f๓๊j}Z*Srะฝ{Oอ5›uช็/Žmx+Fž/;6S}MNt|งM…E ‰�่ˆ…+จู๊กๅ๘|๐jฑไษ4DšPKi2Pฅจ9ด์ๅัื)EูC˜“ญc  DํpSHํsไv ˆSเล' -˜”…–*๋;�์z’ยKบJตผ๐aุ‘„ิ๎eฮ^‹!ž\ฝฬ=ฯžyD4 rๅพVfั๓็Cฯสฏ ฒจ~จๆgkQ’aฅใH;Lm>™4๔0ษำ/+๓ZL’žR(ฑเฑ++ฝ^นfen฿ั–”ษษฅฃtลyฅ nw฿‚ฝนgดคฐtiเ<บ`3vM /”ู;7&๗๖ฌ~ท Mปbวฤr,‹n Ÿ๗UฌืๅSi๊ B๑ฅj +ะ!ƒยCะš“ฝ๘ุ—F์`๒ภ‚@ซ!C"+ยโ9ฐTX&caEe;ฤ˜2y9จถ/ร‰ฺณธeห๒ืW`‘J-1ฐ\“๊ซชVสฌฆ"ฅ.ไDo;jษ …j?น p†P้Bu/tP๕ = HŽฉa:ฃ™E๑9๐า‘ฯ=„IตนY‘‡e�ดฌvn N0mv:>)~กTฦz…rปเม˜Lฤ๐HธO=;OฌmญๆSี›ษ๛Šp›ฦBใ๐ต‰ษ฿5yฺ.ฐ#"–9&๚7ทม๏‚ปฐ;FnTอ†ว=ภH]FฃพNทฬ’ล”kใ–qS‹˜!Tš#†–z&‰<.ิT(X�Z5i``"O ЉQD฿คฯfรM.—๖๕yฝFcs]๖ๅห eอWf!uvษnทzฌ›Pภi`qฤๅš:;[R3qื‰ห•eฦMว๒œั8ำf[ษๆตษ๑qTฃั*ษทชลxม—n00ทQฬฅ^ƒ(E ‘ฉ๙๏p@Wฐ‡@ิ;)"N๎„\ผSก๓ Wฯ\'Šฃๅr= nฑˆ—ธŸี "ฉJ,บ“’ๆB๒ฆฅ^‡r๒ผฤœžเHู‚฿_TาTภแ๒Sฐ6ฌ^ห7้PYZ>jะlN/!IฌŸ|๒€ ีŒืย๊�žฑ" KqLHๅbหU‰„+;›ศF5— O(ฒ™™(€๐ฉ4‰‹ั(|๘1๖IOgQึ,ึB˜ ฐ&="uxX`ŸC5=Cะ"Q,,๘TJ=$ "r@E†ญ2’ำ29แ `์D #ษฐ*V'ำร“”i!qNŸ›‹R LJ-yKp@5‰<!งHŠ ป็ะๆ ย…• vPAถ๏า•œฑฌZฑkd;œ)#ฬ7RvXืc%๒ Ÿ+ŒŽsคB l8HหฦใVฝx๑๑ว๗๋[.^ฉ4z7+.Ž๏ŒนดัXiา๘V๚ฌFวฆ"Aœ39ูืg๗VคชูX๏ภ๋-ํพ™๊`U๛’ฝ~ณงptิkwWฯคฆVU๙ ฬพฏฒrณ"›ร-”ŽŽธผซjฆ:งttฅ๎L๋{4ํํFฃปb•รชRŸืUTิ^=ุ†<+๒ฒฟ$N;<q-น{bJq๕๏?ฉ๙ŒฟแำPโ%ฯL$! Q“boBXภ N$uˆ…๗€ะ๙้Iฐ‰„ภkdรmง๎ต€Ž|ฤฤ(œ(๘‘ๅnE&•‡K~BษTx&เฺ0ล`a ฐฦ ภŠhฒjผธ}‰?กดุJเัCh0ฐBฏOHHยยcz}R*"ฮ–ผa!ๆ๋322R)P“E ’œค/nvhฝ^œNnคB‚จๆrษ7ใmD ฉฝbๆNC…๐๊Y�ิ“„ƒ๕_Ašศฝ!W†" Jี‚์‘฿�jŒ„‘"KŽGฮF@ฃ”ศ3„™ชีะŸE E`จ็ปrss'ว๗๎นฟณSฉจ˜ด77ื2ชถvรZ,ะ9›[8=^i๗บกฉฬT5 v"C€๊ฏพฺ„l#MUU{{sณV,€ๅF›ฌj ฝํžอ–๖s๒|#พๆอิTn.๋…๘-@๕laแไ$ˆl็LffnnpzŒ-อูส_ˆ๛€pิW]อข๚]ฃ_ณ03#ศ๙y‹A๋xฑIŽC‚›%Gข:ื๑0u๘๙้”7.6ปKฮGPšฮฯณdrภ็"L|„j =โ9ˆ"P}ฺซ“eB]Ž„l๑……"ิHEๆcุ†/,:แไ้อ่pc ธ1l-Š)ๆทF!ระฉ„œ#๊š๚–์Bภฌ0[]HฃบffFัยˆด—Lย’ร]ิฆFญzcฝ>?Cฯ๏T;ffภdฒโjฎPŽบฺT;ภ�dio฿ฌฆP=๊v/ช๏jจiึ2Pน(ฉด7Wวข:[Œ+โYมฦ>ฐp๓ภฒทA„7�Ž๗Sอgะ-!›วƒหgด†+RษMเมญ„ฅgึˆ™๔๔T2mมแลวป*๒ˆซ‰.BตH๓€‹๘ซ๑˜ก,Qธร,‹หƒซษูs‰$ช๙๛ณ๊ิZ•ูL]๖จึใ=ศฯ‡ rลัจๆชILMCjธ ษPZ?ฉ็/ ชษmTำ7‰z.P-CกA{บFร‡ช�kS{šศ^ B๚^‚€’5+}<A„ ๎›"”gุ_DoD‹ซ0…(ดฬฉPจพดqฟบZฆงQ-K.Žชฟ กฺ๋Tภ, FFชนhซฎ^�hๅฎๆๆ5Dต7ีฎ}จ~๑2T;TปXTฟ‹บ5๔๒‚ละŒเr#byเ'nŸ๊Ur’ฟƒRvDS:&G2q)ฑc๖ฦŸนŒŽNZ•กˆj(๊.ฆ๛,แพtไ14:7)"ส ๙TัD,4)„ี6aฤ/‰Xื™W ต'!5qLqุ}rษว๙ูIไ"๑.ˆ {JŸ>ญ๚พP๗๔้ณกฑกKC๕๕หหC_บฟQ๙โุ้ฅก บz];ฯ/]ฺ>v้าฦzo†ษZฏOJโr†'Voฏw}๙ๅุฌ�ใใยซW!|๑ใKวŽ=|x้Yวว๓.ณม เาผฝ‡C๗วฦ~๕U๓ ใ้ำK—๐[7šzฟ๒แใก๛Ož|qืี+๚YEพVแั๐๙QM$ศg๚V‰&b~จ’ขhาxก๛•™/มๅเ•’ย!7‰€บePtlุzค%‰ว š ้ฃซ~าDUฆlZz @ ฌ)น&ยฝQJ๐.ษs:น/7ถŠ>0j7.๒>ฃ>Sจ yhe ุล“ั๋ๅ˜e‚.Dคx‰Q%–ฉ+cn๚Užฮ”๐<ปQœฉ?Go”™’ฬ?พโโ๑นฑ;††ฎ^]yพwi่[c—q|็ฮgฯส๋ฝ฿๏€ บ3ดพ^Uต๗p์ะC"C>D๕Lv Ÿ_ุƒิ๚5ห“'ใ‹ซw@�?h4Nขถพป7vแRSำโโ”ฬวž•W;^ผ xแ~Sำ๘๗ป†Žํ>พTณพูƒQ4Cป{Cw.ญฏณจ~็จf<รัโ>่ญ( . YLฅLŸTe า๛Šข&ะพลy ชล‘๙|tAฃ32•&6 ๕ญญ8๒๓นแ๓ กบQ=Dกบนyy๙แว�ีี ช/ัจฦูณ จญบqฝญ{Qจ๖?}๑Œ’๛ซฝ;฿รผศ:†ึiชๅfš=๋ดผxz‰ภQ}™B๕ุวี{๑นoัK6ฦO๓๓#Xz<=ผK๙ไSRา^"ฎ`ถ>๑-extๆ.zข#ฝŠ<]๕ไn^คใUw]ฤU*st`IอฯๅTึ+ N็Ÿw‰tม๛o ๙HDฝฒ8ีกMEัปBด ฌDs4ZŽH๐Ž&ฉึ แ—๊๛๗T๏๎G๕6…๊‰‰U"Cc(CชำSA-'จ๎�T?ุ‰F5ˆƒ๊ฏ ชƒdRจ~ƒ๊;4ชฟฺfQNไ@ถiฅ<XเP—ผBSฑb๏+”๙ฟ~๚]“Ž.ุว…j)ธ2๘B&๖‹hH5&•โึ๕/พƒt“Œ/โฝ;TGด_่๙๛?^๏w\†eๆ๚บo`๙แXMอ่ไLˆฎ๔๔้ล๋;5]๕ฅ“๓๓••c๏oิP‚ฺฺ๊น'ปใใCสฯW/.Zก=|Whี๎ืื?~้B๙U#ฮ‹a kkฃ+•ฦ๙ีี ๚ฯo.ŽZญKKcw๎wu}ฅK0#wv(ญ๚ @uDกi ี๔�ญ๚%4lg&—๒ึษ[ข<Œ/‹่มM Ÿฝ~‹ปWฑ/:ํ%ท]�ฦ pฃMซE ๏KคIZ๕[ษ“ใzยจŽฤ{๎=๐gr9๏nŠr’"ื\๎D)ะตฆFกX}2ถQc0<}บ{฿ฉ๒ม[}ฃ^กญ*E,y<ดฑ!“EศQ=›Ž.๎์ =ณ:*?๎๊สžœ๏ณั=โ]^o_œปsฉซ๋9X>A AศLัไคีฺืท‹/€ช๖๙พสพ‡ ซ•sพ้U‹๊ทฎY‹ฤ2jึใ๚๒lำพ—ขZObuฉT๑ฯC5†,ซL ๐มKTˆทuQกฬœwฃTว „๛๋-$ฃ๎ห๑;w๚๛5SK(จฅ{wถ1๕bโฒฯพrธ^ฌqนv}U3<Buq๑ฮำ œ"ๅŸฯ”–ถรๆปจ‰ Vฝqพ๘{กผืŠGีŽ?yr~Kหภ�ฤฃผ๋jgUฉืปฒจ^_Gช๛ฯWl}Q-ย ‡›gภภu|๚ย˜bM˜๑~B้kท\ๅ๑`%7่t&:t_๊…wŽjtฝ:)ษ๔w9AฃQอแL ฯ!kk๗5’“ก\รWNน…งว(€่šŽ–!;ฅU#ชี฿?tมใ6>~฿ํb้จหํ†๐ฏฬ€j€ทnb Y}:๔ฌฆฅ…D€ฬฬTažสŠฌฆว_ะŽ_ะ7บ|็R้ฤ๒‘C5ิซษฬŸŒ0žP &2>_ซลhN์‘H๘Š*ื๘2Tcุ/Fก’\‘_Wปภ"#บฉ13`�•;`ภ’s %ช{พšB5่ฒMฺฺq4๓MRจ†ผๆ2[IYู ๋ฦญ๑๘q\<€๊‡ ชssทž๏ฟฟบz+‹|gวf+[#5 zg;Œjฯใว552 ีr๙าr™นdoํ๎%ุฃlˆF5ุJŠถถ7ชIFdุzT/vีy$†๗G,†„">ไgiไ$L*„kb�แr฿ชB5—ฤคaเD>) ฆ6๛ŽAu&๊ฯ>{๚xปฆ+!PฬLฃšณ8 ๕ภ”#CฦฐV]ธธ8tษf5_บt๕jN้ D฿zะ‡จพCฃz}Œ$_ญggTWoฎฌ �Žก6?บ8_b^({๘}+ขบฉฉj๘่กZ$ส€^}“Oจฆฤƒ‰ฤq*“ฉ๙ชึFฃJˆ‚,YMฺaUฏƒ๊JWžœ^aJHv ษy…น™xษฏ1)จ๐T*า๔}กz ล๒๕ฮวwššึŠ ช-ช _<งหฤˆฌ{žฏโ—๎ ช!คUs8ำ฿ใ`ฏz5ิ‚ฝtih์าวฯยZ๕ึฅ 5Mˆ๊๕5>A๕ภ�ธa<"๗ย4#Gxhฝ็Nว9ผ;.ผgT๓08:ฌGฏyP๋&=ัฅz‘เว้Pค^ะฐŽ"ejp+J ฮ…ทƒjy?ชมล(‘˜LฤแฉP๏xrพDซ†‚ˆ๊ิิ็ฯีEีฝช็ฯ/\BGค Qจฆดj๑ฤฤุใ]๖… Wฎ,n5e{๛๑ฅg_5"ช4ชปภ)๓ีzJ Š[M…ฺ ฒ€๊๕น็`หCไH…๊นฃ„jงต1XS*MM=(๐เ=ขZ$‚ิ0ศ‡สS*‰ปo†TV๊ ฃƒ๗!๎S๖SŠ•sนฎJ—มJตกbWAฑ‡๐>Hƒฤ5ญRสFฟ3RวขZDiีMŽ/มyำิคนธVBฦ�RX๘jI€[๑ใ;4ชทท)T‡ตjง๔๛eค- ๚โ�ขzl๗ามZตVBP=9น.ž!|�ช™=โJซฦ\! aฦัuLฤZDคฐŸใ#ŸBตZ9•€*,_ผO๙นำ)~๓ฅแ ๊c!ี\n ฑฆ �ฉ5‰@๘^QZ๕ใฐVŸZu ฅU7‹Kั5ฝ{Œ :R†"ตjD๕รฑcฯž]น2๚=xี)ญ๚๑z„V]N@j*\O๗@ฌw‡Pซ†7ธท ชG ช Gษ�ยใ%+ไ^ฏวcฦแ๑ฆฯ=ขšZะฆ+•hด–+ตฑกN˜e:๘ฦ’P^*l๗วV+OMญtzC}ya ‹ ๚9ษyhก.„.‰HฌY, ฅV]; จฎ้r M7์ฃ%/ญw•^^}<TS >'ขsk๋€ู†ย็mๆซฦ(ญzjr.\(๏฿ฌw๛ฦส1ก[‘ึชห‘ศ_}ๅฒธ๊ั‘ก;๋๓_ บ {ŒฏRฝัo|ฃš‰m'‘ย}ฦ)`5—ะ#m…`Xƒ` H4‡ย†โุBJž7jฐญ†(ม‡š˜.…\ r๓ฮ1} V=5๗๘a#8 !๒่~–ร๑๐ษ๖F@&Gแฉฟ6๒’]"C#aŠาชมu๒โ้ใ/ll$%x๏77ฃญบq$l�ท"aฃนิ้gf];q"Ž– ช๗ภˆ่pแทbMM๛่ั‰�9าจ&ณ5:๗'ขใฏ1FL…jž`_๎ปF๕ิ๔tี5•ี๋/Gต›B๕pช‡_†๊ญ:ี#ฃิ4"Gฃz+žPMฆ~ฐD$๚‰๖ีีฒ5ีiT฿ช#Œ๊ก(Šาช#Q}ีฯฬ1จ"จ‹E๕ำhTร'+GีกขาcถูฒยรlvgงฤชŠ‚„ "˜jรฉ#ฆˆLVนเาศ^b!Iอ`mฉRUZ}แŒฐ j•คžVหว7กd‚w|+bP;5๕๔ุ้Pเสฬึึ๎๎ุvVM`p๒—K†ถ{{—ž๏ํz<cc5๋•ฃKcc6[ษฤOa์aMW'…๊ยฺษUp,ึ_Yห ย,2{Jฦvืืววm๗1|๏๋ฑ!ีอ้ญฑฑฌฌฝฦFfnuw๛ุยยะฟืป{8={cY๋`ฐM๙Š฿?ชฬ9โ–Œ  ‚j2ฬ‹ Ÿยๅ๒zตoถ<~ฒิ`ต†ฌ|”9X–D"!/Sงโ�ีน…ฯW‡†šš๒ภ%ธ‹ำQ=+–ŒC…แš.๛"ศPcฃmJžสๅ2dฑบฑ1˜B^oเๅ~๏าv—;|y ฐบบ}฿ใ"๗7U ?๋๏ฏš˜9ร?๘g* viจัi{ฒ‹nลี1ะฝฝc๎Yีาฬ†’ฑฃƒ๊ ‹ีf;9ฒl^E~|กš๖/J)wžซ‹FdœKฅ€j“๒M:s@ทX�ีฟC5†“ {S,ผฏ›ฐีตตซซีPวuwh(ซ฿าRXธ5ท:ด I;{CN็“'5๋๖ษ”’ีฌ g0ธ;VOฃบธชมฟu“นA”{›ณไษny9Auu๕ื‹C๓ี—งฑ–๒๎^IcฃVปดผ{{aง™๗0;w๗lๅ…฿ c€๊ชnpRR%๐๊–จ#Qํ๓ูํJ5Mข:CQไ๑4’p1‰Lฅดะฝฉืฟว)‹๊ๅกก~Cpduฺุ<ณ–[ธ…Œ^ทO/ŽkดญBฝn&B†ชgS่•ศึˆl?ๆVvศหหˆj๏ุXS๐ำœZูI/+CTAFภPcmoทf}๑หๅฑํฦฦีีcอkyใ@๚ฌ#’รสๅF9++ิfณ%็rโีRs*ฤ`%F,%&SSฺLRRŽรeทป\–76จ้*4ิผ€า"RDย ะ๑/|o๗`?ชqz X๒บ์ž(คํจ(บ–�ฅ™‚U9์ฌฆ Y,Eจ๖ี…sT›……*Kัฬ…jศP9ณู >pจŠTุ'T9Šฒ๑จŽ™๘v„:•jตฆŽj08ืึดธG์ก*บVX่ƒ’N}OŸb^CหัFuโ)ศะขŠ#iฤโJT=_ฉ๔zก&ิSยศ^— k@aก ิHยเ<œPP(|ย‹jจ‡๒03#- ๆ€LUTฌeงpฤP ๐ เๆฆj@ตน a+aบV:ฐน™žJจ'ˆย8‹ซฝ*>/OทiA3‹kณpT‹nfF]X…›“ฃผ–/%ฏ€˜๊๊žž<ุฃ"'jคก4ˆาน๎ !๗=ช9>Ÿ-+Jฅ>ๆ๑XไาxŠ�‰ต1ยS–Sี๒Mคž1h\••ฦ75œNฃั$ษ A(๔ ั&ก$๏sfˆ๊70า~๒ž™‘R\Xี/•/ภั฿{ๅจฃšŠNโชตZ ฐƒheคŽ.ภภ๕c๖ผ1Q4Zญ eVŽO,P>›ฑ€+•jฑ่^>TฟคNรปน1ฟCQdฅฌ)wภs่Q-LQTVFฬิmR$%ฦ+ชัง#ฦFษ…๒‹ุรS‘ƒjฐ๋อ ฏืแ�3 ึS*Mดๅ‚ฃ‡๊7$ลตตะญฒL…ว:oท}จˆR๓Qษ% (&Rชย9ก•๛Mส"Š#UcแR™Œสมjผศ!ฦ%ชใaไGG++—Ww๏7ž?่QอืไDู>lfรม90C:nPอLเตม€(๒4Œ€A|ไ tึ ƒๆ๊LP+B.xธ๒8F5Xอ_์ ]ธ44ิ๛;ล3ชi'#ถH—c฿ช<V๘ืcุ‘BczSา้ ะใ3,ฑ๋Š ๛ฃฝo•!ฮQ› 7—`ltีงฆrT๓x]ชm6งวจำ‰D‡ีะ Eaยž'ะฯ„I(z(l,“ฟฑวD…๔%จ!ก‚28R๐ณณจsจทะถP˜ศƒค`•๖ฅ€jๆP`šิ‹z3:ภคซ1G RๅIˆ ดtไฒจsจ™ƒถย๗k๚›=ชนีaฐ{ๅI/ท•ฤช™ณJห‡ช๏ ้# ๊5ๆŸ,ู!๕’%่Dgiต ฝำS3๑sษqŒ๊ทdฉ<จฆ(ะ1 ปใข๓๛™A ˆRk„ ใ€ขม–“xThfฅึ โHใุ�Bไ])ฬ7jๅcQอข๚ศ šรขšE๕Q๏ีษGุ‘eณษตฏภp|ขšdฦ…ะ๋ฃฆ0L‡ํฐกuิ่FBื�7ษ'ภ‚ฤ;”GฺA็€ลšล’œไˆ&#q1ูู๊ŒiHฅขCjชo$A‚Uญy่ไP1ฮo์ุ๛:ฅA@–Q)๏a๖Œลถ๏ุญV/ _ฺฆๅฝก:!=ƒ’ฦŒ””wjตย™๖bSJ9ฏ ‰GT‡ฃBภ็5๔ˆ"Œ ีPำCฏT'`๋Sชƒ.˜I์1„^AปPืš(€(ƒi(‡ี4ฐ1' PCD)'ฯ@4–zดŒ i„จ#“tihภ=ิ\…h8F@u6ชต&ืA56ŒกิPฎIๅหH!)„‰ žq`ฉ5๊',$ฺิ@š“š™ะ๐zBž‹P‡Wšศƒ๎พิHH*T'’ณ|}พใ<5Qโ’ฑ0าโจีฦnJpฦK$ษษฉะƒ+ฅQฤ…,ชJ3“’=ช59๖#ƒ๊ะ๚“› !* f  J‚Z6Z4rHž‰คๆ|ๆจTิFธฬ„u&TŒON q{p•Pฅ–๗!ิTมแBuศv-‚โึ ฬg4 4RrFd./uZๅT”F]Hd Œœ†Œ+}?ๅ=^OEสL|Xา(HM}๗จ6ฉ^jะTร๖‡ีค)3t~ธ&ะUPฝฦy‚G อพ‰ขฺ4„Yefฦ5ฉี๑|zo~VTCู!˜3  /Zื”‘ยHrHณš๙„‘F\Jกx/ุ๏wr์ŸีชใR‹ˆyจ–[*_‰๊ไไlEฬ‡ีQ 6 ์Jf YaโŠ’:b *•ช3ศ๊26ฏ2€|XจNJ:คจ #ๅ!ธi‹Gศกกmžt|ํส> O™“”ษ๛ฐคQ๐>"@ŠXTณจfQอขšEuผฃZYไL*ทU˜B rค‡ูlฌ,b–7‡ ีฏœ6‡[VXT6TฟR๗๙ณจfQอขšE5‹jี,ชqHต๎ศ~YVซKWฤ็๓x…ส^้tfeUบ4‡ิ�r„G$ชy<>šwฺฺŽฒk็(ฃ๚ฐHT๐ฐขTvv‹๊7๊|…;ชPตอlt9ิjOฆtyœ๘‰ญdQืจพ5|ฎ]cQอŽ8@ต�2Lณ-ู,ช฿,ช~พฮlŽาซVฃ—็ฒ[อ6ฃMีqˆ๊††า‘ป๖ํ›๏,ะ%-ํ]ศ‹๊C๊‚ ^{s๕ฬ;?‹‚QnjRๆQE5ๆ๗ๅQสs$ฎฑ๙‰™j cณฉd|ี๑Œ๊โโ‘ี’ฌฌ+Wบ฿นrัส}W†ี‡ีผึโฅ%ฑ@ำ๙w?%xะRฏ%Hข|ka/ญ0cQm†>06ชŠ“ำirYTว3ชkkWVก/ํ็Ÿw3OฅตUŒ๙๕I™วOA€˜D8=!}ฉนะ!R’‘a`ว ฅovv’๐8ฅ็ชี้้กŒธ†ุ?;ฝป๛ิ)ฏฺJ๓ำ3O*(ศอล?ค'{ $*UKหqj”์T ต5?rืZERiZšZšาฦข๚Bต ตpnฮ–ธZอคW‚ิAแnEvJ T ฬEQสO;ฮK$iœูู วquตฝณณ!ฯ้ˆ3ฆง„าjxผใ ยR๒IAAซˆปuw‹Z๕TN>…๘ฦ Y•ผz์qฤฏป[ภใจ๙0+ฤ๚”„ไยย””ใง)ชำา !•NUคหŠ้ฌ1์vEธ ‹๊xD๕๐p_–ญผผป๛๘q%Š…Sํะ`ฒบบ๎œ0ทpdฤhฌ๏œนyณตตj�ฎE˜W;1`4ฺี-m8ฅฺฝ๕อ็ฮขึ’#p�๏ฬ 'j่™œ4;:fožปัZZ Ÿ๛uuฯตฅ%%Wฏข I01ัั1ำ<๔z[ฺ๔ตมสสูYWe๓•ม7“อข๚P บตธguีึX๙m€&^Cร่จุั ์KGQ”Z๊บ DAฃฟyฐๅิฉยยIJ`ปฯA๖vาๆูnz•xฃ๕" `}๓ bท'่ƒ์Wฎ ป˜ถ“›ท๋P?]2ฎ7น,ฎช„-8ญฅ#Ž+ƒญญฃŽๆัั6)ี์xฯจฎ๙ฆ๛ๆFต๑ีจฎ?�ีU1จ.cQอข: ีeฏ‹๊แŸƒ๊ฯีV๒๓ัFต Mแ…jณู.‘yฝถ9m๓x’“#,‘,ชใีำ‹ ว@ซnoVโ์hm™ณv๙GFœๆๆ๙ึxMC7o œ?๙ฒีll๖.,45)kGK<๕๕}K๕ๆ›7y<8F–9เฟyEน๕ณฯJJ๕๖•พššบบญ•š๒ฮฮ"y๚นย‰i›ญพทณ่5hญ:;Wœ.™˜pฺš?ฟ6ฝ˜•uJีๅลฦฦูู…c๏๙|˜ฃงXTจ..อสjlดzํFใ7฿œรOkฬv‡ฝlแ๊UP*lึ๚ๅefmUYY๛Šต฿ึถด(7NŽ66^๙2๐๋te%^ฺ3=าุ่p,”๙{ฏNM-”๖ๅื๊๊ ‹ตX,eiฉผผนฎAu}kkF~ฒ8gyพฉฉgjฅฤำ฿T\ผฒlฟZ?7ืีuM‚–@ี์8จ.k๊3จ.~}T—ฝีk๓,ช?@T๏šcPmฃz)ี~ี;,ช_๚]Bฅร‹QzYYฏWซ…l—}Vณวh2E˜cQจพqctผ ซท˜อMฤฺ๐YqHuoU•ว์ฎv,-uu) WญMM‹‹ึr€7~20ัn+ฟrerัZำ๑MิT{฿B™‡Aต ธุ็›iษFืฌญฬอ—\ฎๆๆต›มญ๑ฦFฏหผูึาช{{]#๐–ธxqกคๆ๘ŠอึิkYญฉนxqพฤ๔๕ีืทtŸcQ! บvz™b3;ปบ@�Mโโ๘x ฐฉPอฯ๗๗O9฿่ฟ=Ÿฌปƒf๓๙๓ำ•ููๅๅŽฆอฉ ›ํ๊๙ูBh .”u\ญฆŽ91พฒพžŸฟ2g์๏˜žvฺnทปฅE$เd๖๔,,ิ๗ž;ว ฺ๙ฒ1ฐyปbgฅฟฟดดฯๆ ๘eฒ๙’Ž+›ssๅๅFฐธิSฦปCƒjašK~˜ญ•n—ว‹jงีซVG๏ลข:P]pใฦ๘R๕ภ๚{‰๛ณฯ๚JWฯƒRาั้ž›๋๏Jบ1Šจฺ ”7ทiววหห'/Wfn฿.ถ6v|S7<l๔,,Dขบข"ปปjqคฆF&k_^(xฝีใK55v/ต#lีฝฝ}s๓๋ยB๘บซอ;KYYMฎญ‘๕๕ยย๙ณวiณuu v YTจพธธEษbcWqR\ู้๊*J5ฬอwu-RโถตU^ใญšดูฎภ๒ซฝ103ณบฺั[T<eณ๕^ญƒ€?ัิิ< ๚ uฬช•ฎฎฬด‘9c—T๔FFฏ{pP@ฐถฌฌ๙| Y Rจฦ-š?ฏุ๏๊š˜ท™หีึqฅb๎yMMY™นฤกZ ะส]L8u–ูใpTไธํFL#ง‡ูl5บ*L‹๊8G5˜;V๚ฌึฒฒฦฦ+u!TŸกดีใใึ๒ฮ6ู๘J๙๚diีu-““}sฐฅPอkm…๒n๊ฅพฎ.ฉtdูƒZ5๘ูU;K Uƒคุ;;ัiDด๊?ฌI{;ss—–ํ๕๓๓Vซ฿o_ฉ์๊*.ž/๑ttฌ€n^]ือข๚่ฃบ เโโจี:?o>fnjBT่มE5 ีฐˆTทT—ช?Q]^]ฝบZ฿[อ บก'ฦ;'xคฉร—๎ภายจ6ึ++๋๋ปA� /_v:ซษQmญ)ณw บMณ5ŒŒ=ีb๑˜๋oกVํํ3ƒ%๐กZ$rx=qิVซVชU๊ŒV›FตวใVษ๖ี gQwจF๛ˆแ^ˆ^๙†�๑ณฉ๙0ชฝห ช๛๛aแYู-฿)/๎cPํฏ››kพฺพิว šZสN”yšภะGPํ๓•ู:zˆjทฃฒฬำ฿ฯ zีใi„Uํํ‚‚นJภ๖ด@นuุ฿_\Wbผฺy๙ฒอึ๙y‹๊�ี7 Xจพ~dt> ฌk๔'ssฎ™L‚๊QDu7AตฝtP=HกบˆAu ขบ๐K๐ˆิิtฆ ฅsˆj!A๕ึ–9+PoŸŸ/สอs‰=pจ๒ู๎› ชKJšz[xง'หห๛–Œ~ใย|{ปงฆ๙›YดUkะEำ{XP ‘่ …ื่ŒสN„FrT'+ฃีnฯ1I๖๕AaQจnm…ํE๔ฎ ~ƒ2ห‹าช]QZu€hีใQZตํ˜ ๋๛ๆ€ศuuวฉใC\_iปำz๕*Au  R••t๔zwภ�ฒY4ฒ<OY"‰Vํtาจ฿ฉ �ช}>+XSฌH๙9 ีYY,ช?ญZRšทน99ฺื กบ+ ีจUฏSจพr V]8Qฺื็yนV Kลฅ%‚๊‚4„Rސ(T–ิิฬฯq™ืืW^ำญ=Œจ ฝ^sl‚ขอ๎cๅslt ์_bแfQoจ&ใF+,3›šh-$ยVํX1blี`�ธžUNกฺXjฑั@TŒ4๊ิตKeฎฆ๎nPฺ—M Kเถ๏@O๑*8dœฃดjณQ ฿Q$ๅญvนฬf+?พธaQ=1Zu‹๊มVMx}yฺป๎๕ซtg'x [uS๕gดV า]\Œโึหุช—ึืCจvึtึiง!ภ่๖77oT-/๗๗ืQษ�ีเัด!ชsง&ฬfˆ๏žู\Ya์ชW†ถPิ{ŠE5;โ�ีล1จ็V\ ”Sจ<ีๆŸ€๊’ชYTณจŽEuข๚5Š๕ีถ๊ฆT—yT7ญš'บ\ถ}ั6ณO+มzคษีห@ฬข:>QะœŸฟ}›ษ๎บqี@{ปำูbยธj—oมธrใช!โตฌฌฉI +AgฌๆฬL>_ฏ]šวWY๐Z๕lCรœณ1P๏ึ้fg'ว๛jส].ฐUŸฏธ<•ๅuW–อฃญš2€ฌ67ฯ/[ปเ๗‰ห}Yฮ๚๙๓ฯaพฑจเP !I“+๎ซW˜$ีโ้ihOโ2š=W›%D๓c\uE-`ึ๏ฏ\ฒ–wดตํ€๛ฤ8าุ83่Mยฎ‘S'‰D๚&8 ืn๗่รรVีQ9?*รอ†โRืเT"ƒj๋z`kหูุy;ฟxชฌ ์uสล- Iš‰าชชB…พ?ูลlvศ2์ฒจŽSTช๋๊ฮ1sdœ*}จ€hAฮํฎ…,@๕ฤ ฺnDT+ŠGห……@W๏9๎4ฐำ‡มzฒชขฮk PpปŽ™™ษญพF'ฌรl๕็‹ีVิLB ฌทผฐถk@ต Pะ@P}๛6F€ฐจ0Q} ๓;…jจจ์ผ ,+6g‡ำ‹ŠีภA๕๘ธงฦณฒจพํ•4ณ P][๋pด|Dุ๋uฺ่ฅขีo]X่๊j;ื๐ู�S‚&1:X๏v]C-…j-zC๋กำช™สํt๎หJดน2ฎˆE๕!Eu๑TUGG7“fRPะSeุS…n้N๊ โ๚ŠถถโโŸ Lj ๘เ'๛f๕ ช*จš๔ีCโbฐชขนจธส,!€ฺํฎฎึ๓\dฏ™บ”โ๒ฃยZqฏึb(๕Q]=0้๋€บ"ตSพJog๕“^ฟ๛›o|}๎+3SSFใฬm6X๏CA5<๖สŠpš‰เโEˆลฯm(„ํ๖™มึb(lwฮœ; บ์D`บeU๐1๎P=ธV[๋vึeิ๑wททบฎjีXpouuฺ),๕Qช{ใF้จปพyjสnผาา ฅo:๊gป๕รUFc็L~๏ํU4ไTzGฐž@(ท๗ฉิEm’q YTRTืWีืG”E๖๙@ส[2O๑Zs\อ™4nร]๎ฮNˆ(ศล เvฯถuSx–ช0X:Xชkฎ(.&xว V]*-ภาแ�ญAซณ:ิ6mอํ๑๙ƒรฅ^7jั9ฎMtซเhๆVน*pพน\ณl\๕‡‚jฐ3๛*‹บo†-ฎ‚าRŸ š €ษŒW8\Љฏm Vฏญ!mฎฆ’ยK'}˜ืrTkCลBไ๎็ณฯ@ญจ๋ๆๅ–ย^›ี-็ภ4{ฑG…้ฒPน ํ~.ืเเMีU›ี๐ฆ€Mœ๘ ŽQBาฦ+่์T7h|ฐPŒTc.ˆคฺOj(Ÿ—/JdQ}XQ}qธ๊๊ีˆฟถถJM&น<ปM๋Q ซกh–* Wุฃ4ศggCน`Qqกม�PบxAAaP;;+จ{”3`ซ.b(เ‚ย`ฐจhm-ภปx๖š]ฃ๋Uทๆสๅuu๊BY‘ผญญกA&ŸEu๊bR>‹…ดm]zqฑมอf+~@จึนฏ<าฒAA่1ฎญญกฃ1ทPf0ฬฬžKไๅๆb 5ิZ[{L๒"%VผึhPฺฮ ‹‹‹Šฒปoˆzz †Y๘พฅฐPk_ป†� ๆC[qf1) *gืZ[Mธ)O ฮฮ&`eIƒกฅ-kฎโbR*7ตดฤ?ช…B—s€Nํ‘ษฏ…^ี๑‰๊žชช7-{ะ(ˆ— fQ}XP][{ญบๅˆ_๑E5ฌ^๙|oe,ช!‡cU(^ฏ็‹๊8ีชซ‚o ีq3XTTฯฮd๑+~หจ๒ํ๖ตNmfปL๑บgศข:>Q-h๕ยข๚ :ร}:XTณƒE5‹jี4ชวenฏอv@8ต\!xํŽำ,ชใี‰Gqฐจ>,จ†q๊จ_๑[EตPiฏ<(๓ฅB+y3dQงจ>๚ƒE๕!B๕‘oีกถยๅ4#š!3>"œฺแPคŠ^ YTวษ(`Q,ชYTT E^+i์โ๑8อตO•สดs†,ชYTณจf‹๊ท„jจOญuY˜‡ hFช‰b–อiทK$?*5E5‹jี์`Q–P-8\NสเกซฅyfขWœFฅ๒Gž!‹jี๑‡jฐUฐ"๑dฑ€E๕›BตP่๖าจ–้%Š มฬ—J™ŒE๕!1จ.€�)‘(3St\pD/˜u+ญย๕P…ยSG5ไ-กš—ŸOw#ฯสช0rˆjณำฅT่3dQŸจ.เA•—หn‡ชLGtzฐจ>,จ.(ศ-„2vh•œย;ขฌ~๋จถฑจfQอขš,ชใีษษ3๕@œf0~˜*mฺ/vฦข:Q …!ซๆ็ญึJ๛ๆ็t)bฅ pฎ๐x๘ฃษt* ฟsศ€ผฒhค›–๗ f,ช ชกˆฏบi#ช(TƒAD@๑ใ–vL I*%‹๐๗‚์(ฤฝ๏ :”๙ขRf„3dQŸจฦ๖ฯะ๒( ีNf&ƒj๘9-ี—0e@#Gป"‹jvผTOMU–9อ{eช‹P)T‹D\ฎ0์SIฅd๘MPอI;~CE5‡ใต;#;ฺ\.ํO pbQจ†s+•ภๆf‘ajภปQXUๅ†Q=˜(่้ฑ@Ÿอ™™sค_จ ฐ๛1x;ฟ0hฑ`ณ—์p‰aี์๘‰จ†N““ฦ๒ŽๆMƒam-ฒLMๅ9|(c็8ล=(n››ณL๓่`Dษ"tฅ€าๆ9วๆฬเŠjxฉTึฌศž/Zญ่'!‹๊๘CuAAํT{4Œร…#mผัZ5:bณู;ฎฮ๐Dฅฅe%ถฌ๒~hl.)ษยq์ุี๓ื†'หสฒฒ™ถ๎xพ`ี‡ี‚†ฺนน@ ณป;ข™๖ๅห} €ถŽŽถ›…S(nๅๆ:บ%โิ—ฃ๐•ภฮ‰ํ}Ns ้๊‡Š๊ฤDษJRฬ2 ลOkสมข:PฺZUฺWโ๔๛ฏ]›mฃœŠ ฅ+Kgกฃพ:M<9้qzŒ~7฿เฒณ๕โลพ>ฃีSfnl<E^:โqZญ@53wXTณใ'ขบ  กบ–—ืฯ\S*ฑงฎ๐nLN๖0Z–ถž‰Q'ˆ›ตผyฐŽ’ี)์Gnต๕Wfzzฺ+l4ชy<m…)zjีj๊ฒจŽ;TCค๙2บฌKMM3eลจ)qž?ฟธ8฿ุั2ปผ฿Ÿ3<š•๊J์‹#55uฃs๓]~่]ึq5ฎ—,ชชo.อ…z–พ6Ž หหๆแRh\ล7ท…"kl:Oกไp}2อGา29จ๎eQอข๚ˆฃบ๗@Tฏ2จ<ี๋,ชู๑๖P9‹๊ŸาZ€—_ค๒xŒF‡"งŸ!‹๊ธCuACร๘สBฃณนูแจf% _n7{/ูื่Ÿฉ()้ฝl2+๋๙ช?›)ฑ^น"ผ1บ<฿ี_[;_ๆo:ฯขš?ฯ�rใโ4จทรัูI๑ทตถถ ๔€ฺ๊`IIsg๛\_WKหฦ^l‹[PP5พิุˆ๑K๕u฿ ้nคŒE5‹๊#j๗>T฿๊9บ–E5;.ช7Tฦข๚ว5์r๙2™B‘,๑ๅ,ชใีฃ# YfฟขกT๗\notRZต๑ ญบ เ๒te ธyU‹ํNOee‰-ะฯขš?ี“%%ๅๅnwg'eเ|j#ขz.„๊=“nw^˜Dฎ‚I„E5-แยŸ™”ฦข:nQเ่V}0ชT—nชo<•8\ Q}NงE5;ช�ีฮฃKกบ๕ T/E บ4งณ‚’JฌMฝ,ชCนอRYTวช1Xฏ าร0ๆฺlบ๐~65ัnv^น๒%@fซWW›z5QZuk๋ไธqฝWจ…=U>ืศH™อ฿t…E5;~ช r{ชๆๆœ5ๆฮ™™ฬL๐Fq1 บทzช T†ฮ๖%0€44 V‰จพAกบฐpi•E๕›,ชใีh฿›œ›/ฏ™™‘&wO ˜!dzบ"@ฎญฎ๖7~ฌด2!xญœd๕ฤDYIวUี์๘yจF-9wkหำ่๏ฌN‡qސฮแ*ˆ�ฉู††๙Uc1hํPuvๆๆฒจfQ}๔Qฺ00ฒR^พน™g˜mฉรOjงFหฌฝฝฃ[Vpึฌออu๔[Jอๆฯ?ฯ/Tgงœ;GP฿Kํ\จ1 xœ๕็ู`=vlTไNO[๚ๆข"ะซ!{–:๔œฟ฿=0้tVฯXถฺหอB™j5‡ฃP$q‚บ๚zฆmีฌ[‘E๕‘FuAA๑ลชพ>H$7๛{Iดjk+d+bหcSต wqั ?z๎๎าE—ฟพปปธxิb›.žXX0›j6ฑœ?ี‰ˆๆษ‘>พฎฎxf‹‹๘;ุ่๊พ้ม:Nงณผ๙๖ฺฤ„ีZbš…ฟม'๕ท๋XTณจ@Pm{ชหFu-‹jvผeTOว ษLPˆ@ตQ]ภขšE๕F5๙ฝตUกPศฒR้ฉVX]fgง?‡™‰))3311ทP’~๎œ@ VไทeHk.์จHM‹๓ม ,ชใuคฅfF•˜ๆ๑r%R™,;[H=2€/#5A D…™,ฅ-ํ” 7ๅ๎8O$Oา)qไะ+คmm๑>๛Ž'$ฐจfว{@๕‹jvฐจfQอŽท ,`DทลVกช์Pค?NUE…ึ\าZ@ะ*LK;uช @ฤR›๕ ˆใหๅฑจŽ฿!„ฦiั4ฏHc^ n"า‚๚ŠHK $8 (i6@‹ฃˆ#Š๗ึ‚4˜P,ชู๑บจŽ๛ฦ-,ช?ํธR3?คWSfฆHฤขšฏว..—tซใ}C–ฦๅF,ฑYTว—0 „ฉฉ ฃ�^LB!‹jvผฆ&#HHIๅˆ„ฐp<ฺCT332จี3‹๊๘วลโคคดฃ/Œ(Ž™ฉI ฉQk ี์x%ช“ธะๆ๙ii™ษษ,ชใZนิิ4แ12นฉI\ี์๘1๖[aZfff๊‘\Ž0FXTวกb}CลTp€ฦิ&eQอี,ชYTณจfQ}`กŒX9dQอ cผH#‹jvฐใฅrศขšqcงgQอvฐจf‹jี์`Qอvฐจf;XTณƒE5‹jvฐจfQอี,ชูมขš์`Qอvฐจf‹jี์`Qอvฐจf;XTณƒE5‹jvฐƒE5;XTณจf‹jvฐƒE5;ุมขš,ชYTณƒE5‹jvฐจfQอี์`‹jvฐƒE5;XTฬ!V˜ผd8TEม+Q-8~\ฤvผฅ!~ชก{หุ๑ถ๔žfQอvฐจf‹๊;:—™ ัฮแ๐^†j/ š๘ฒƒosp8‚ืA5O™ษ,vผีไโ ีZ‡ภj.๗จๆ&%gd$ณƒoidddคฆพ&ช“’XYdว[ฦไTฮแDตP˜šœ$f;ฺHJJN†ž/Eต@(LNNb…‘?cp๏~๚ั‰?3ฮž8K ๅฃŸ85ช9œฟฝs‰i#ึ0ฆ[ฒ-ไ`c›8Žx% KtxI€B€ศ๏ๆqi@ะ0ฬ#&!@‚2เˆ†�ื6œd!P[‹Q‹I๎”ˆAZฬร=GIตซ\ๅ2ฤHฒ เํzํชฺ๘ฝ๖ฺป‚ฏภ๗S๊• ๗=)๚ƒจพส@ …:ต$ฮO`šY\๒๙ฌาจ„มrฮน ˆ๔_์าR‡รvูฆ �ีyp๐‘ึ!๘ผฦ๕3๊ฏ–S จฝจึ]$T_น"๓๛0๏rkไ1ข๚า‹‚ศOขšw%ุฏ- ะOjตฝ›ื7ฃi] *aa}q ˆjข๕m‘Zว!๕Bต_SŽ^_ฯ/zUีH^๗4ๅgTUฅฆNๆ>ๅ๑FF2jชนh…#ฅ๙ีณ[ตoฉ)ฟyด|rฒขโPŽอ์ฒKชถ้๏ธwฟฅ…ผ™ฺ์Yใ1^vaกษ4ึ]ู฿ัQ฿>๛ฑCf๗๕Kj~่ฤum{า๓โEyyตหN๊’‹�๑Cuถี‚sEu!ขQ Tท๙ฃ๚9๊ฅๆ�Q}๗”จ–"ช/โ7ง๎ข0}BปjลžวUPE^/MฬX"=๚ว?fV“ๆบไ๒{๖zังดธปiญx4๚‘5ส๚ sว๒ff\+๕T Jjjู๐ํWฏไr์BTSz22้ถึี‘คิสสตตขน^็ฮŽหีาซ}2bตvี}ี•KKVsQรืตdศbiooภปv$šืŒีื/^ฌฺีmฎี[ฑฎ‡}หํฉh wv6]EUกzwfฎ-๔QT็TolฌฌT7R๑–ิป…/›ชซีˆjีฯชWk+๊y{{๕ฝ†พ ทปซฎ๗จถฤVœี๋G]ข๚I๊<ฉ9ฑj…EตP=7>^82ใฐ>~ืgsXํsFใฦF„ฝ†ฤF‚ถํฌFฏo๋ŒำศๅููZƒvL#“‘1*ีุุ: ฺาb0$' ูccฺN•Re044„ฆj`ใYี[ีJฒFg็ภฬขขฑ1 ‡ ช9จ๎าtว‘VตถfทW ส66ฬๆๆ‡ืF-–j&�ขPฦด 4ท(!/ดญอ`ˆ›Mt/แฆP-P*c ฺ8ลฤภฏ๎nXต1,[3>ž|E˜ฺูฉำjUQQ EŒกg๑ข๚ข้dฆšฑีบ’ ‹๊n‚๊ๆูผมŒŒkeSn[Wืึุํ•Z๒Y‰ฐCฺู=/s๊[๔๚แมœๆ๚+W�ฒฅีฏขขž>อI,ศฬฌฎ&จ๖dd”––*S››nซใก\ฎช์ijji)์หษ`]uฬภ@s๓เฤŒฒฝžŒํQMิGป๊ย2hUyy{{ฎSvแ๊jllk]ฮ๎บูะKำฒBXใฺตาาผไT่x,-อญ•w3ฎZVVึTZ๛ A9<\๑ Qูื—˜X yZึิ”‘๑`6๙n๗ภ@uuมภํ^ฒ๊ไไ ข๚‚™๊i]u๘Evีอใ๑/_67฿ขQฝธธJPญีrP=<™ABƒCMอน EOOSG)€wฌฟฟ4-1ท บ€ ฺ•˜ุั๑ช%๎F็ภ€ษ”ัTœ—๙yK‹๊้pGi{{aaSZม(ํช•›œT/"ชีG\uWื๐HSZFy9๊‚๊นบ‚๕ํํ–GTSIMํฮHฬ(.†ๆ5:›9<ั‘QPะๆuีกู==ฅ๐Nฌvx"1๑U•jd$-ญผW[ึำัๅ๒ฑleSiข™ฃcฐjbว3D๕Eำ๔I=๕็๙๋]ตkๅลภ}‡enฮ xนบ67ทณcณZ,žฬLทปขต๚ldฏoุV์kซžŠขยBทใฑญฺ์v่ว‰5ป์&ำ๚Ž-ึaณmo›Fsืึฬๆˆ”าžR๐Cญ=Ožนa็๋ป"yN\๕‹ล)‡ฃตu€FuWื,6<D5๋ชMฆญ5๋Jmo๏๎ฎีœUุd6ฏฎVฬๅ๏�ธG›trค>yฒ๊ฐz<kkะผฺ‹'-–ค$ซ%ขีDป๊๚%ˆ•x"lะV+ศ>*ึ“xwnฬไ๊ชหeณน\EใืH๕d%^+vป].ฯ9@T_(-่tง‚๕UำจnTฏฏRจ^ต๚ฃฺ:wหี[GP]‡จFT๛\ตฉ๋ช-^TฏxQ-cPmcPํ`Qํ๐ขฺม zี€iฺ!T;\D๕ลS๘IAญป่ษzเช-๐aฐบ์ฝฝฦ์มฝ-—km-ฟ5}ี–•eฑิดS๙w‚ิ‘๓vOลQ[ืผQรฺข{kƒƒึXWkWTษ�‰hiY„IEตimmeฅeถษเqฎฺผM็jhh{:Ip_U…ณG!ชYWํpน,–ขบvน|ii5ึ๖<kee็Y:gIt๖๎ฎล\๓0sw76ถฆฝcoหbIL\uญิ.A\u๓ฮžูœ_soอถโบ}ๆN๊ช!Lฬ8,SSVsD}iขีณeป๋ภ่วลุญxแtาPต@}ข'๋ชV{mUUh๊ฤ˜ีีขึ{ซkตตGอcoช4Aตex˜ บzgP]s|ษ`1 บซNฏง’๕–OL�ชป(T—7>}๑8WฝMฮžœ\Y9ดจnlฤd=D5๋ชVซล\ินฃKถX๔ื๚๚&๊jะx6๔0ฦš=X\t8j๊žห‘ฑต NโชM{€๊šD@๕ถ+>P จฎจเ ฺSLšh}#…๊๖‡๑˜ฌwษQM`}/X.’่ใใsi)•โฯrีnpี ยิ‘ณูํn~\บฑfตB๙‘7‘ต พš>ข๒W;;ฑฑžฺคญM‡rี,ชหห—FŽ”ๆšต-ีวนj๊pเชปีˆ๊ฃฎฺb1›+๊�ีฟ๗ฏ9V>1aณXHJ&sีคv“ฏuฆๆฑจ6›SR67#์YPฎฺดm,"}ชUซgV7+’๎ึฎA‚j็='…ธj๛Jฝผlฺ๒ใGที—ี%~ก๊/ซ๓Œ‰‰๙Y |ญ–๗YฎฺbY�H0ฏpw/6ึ[(gš๛๖vsฏท๙>ํ_wธำำททkz�ชอ*ŒHJO?Œ๊@umsฺG]ตXีˆ๊ธj ี]ะGRYนๅv๎nฐืGฌฅต5Šฌ”ฺMพึ™ฉžXtฤชฉŽPmEฺ# ชc]žˆˆค”ฑฑฉตMปหํฎซ\r˜].x;)ฟ>—ŠัษหึaWˆ๊o �?x_ดLQT ”ii๔ำSฦวyŸแชทm›๐]’ๆOŸชอีฝร๋ภlˆๆ๕zว*V>rปญถ•Sƒ˜Omส‹‰ ช#ฺ๋Iฌ:ซ:‘vีฟO8ssล#S~ฎz{ถต ‰W-mี„ู8\QํsีVwD…‰ศ6Vฑึึึ'O€ูฑลG?† bีฑLฌบbีฤU็ฟHซษ 3@จXuDmผcาh&๗6]V‡ใแรž%pี.WZZ~~ฦƒLฦUC�คบcี—>�ฮ`šัม—CตDฆษสJ"lNJสห“^ศq/ฃ๒ถฅ!B่–ชฒลuามSOOนG:‡In kl›�ื5฿ฮฌฏ' ,ช]&ำิt๘ดะฎ:๛0ุn๏ฺr“277=DญXฅGV#ชyLˆikรบm๔(5ug P]WWY9ณj1o?~LฏMโตญ‰SSฑŽึ๖ฆu�ณษT|;U<ญXฝ^ขจฆ�(L0ณธป๎cปชชพAษํล9๑q7iWถด๋(ชIูย KŽj.ฅ—ษฯ๒มC5•W68ๅถVTŒ6ถ๕ 9ะ†หศWBปฝพั‹ju@b‚๖Š๚`ๅศˆลR[”Xœ[]Mz~\uี�bWM ๔ูlืดไlmัจY]ตŸฟข]๕&“W|โ™=7ง๎ฺ€ฬฉ–D5ขš‹๊™ ถแC™์ูฦjฌตฝPฝฦAu4GmMฺฬ Iึหู}™J59™€jสUWOภไKE9นีป[$”WUีึO%ๅๆๆไ&จ&ฎบmi‚ฌ๚‡ภ\rTO~๚€๋ๅๅ๛๊ฟีŠ”ฺ๚ูžgOฃธสยตอนš1ywฤๆfk๋จ/6ัน8dณuต๊w๏.ƒ>ล$S3ฬ:iKiฬใM,๗$ฟoณี˜๒ข SSภ}น<ตl“’uo3ฝตuqโพง่aหิTญUX!uธฟMภ๒นน1Œ€ ช‰๚๛†l›0ฐตo ZL—@ฐธ>ใI้…žํก๛vศด๖N“=4yฯณนตๅˆ5ตv—MNฺlOM๛ซพพMk๋ใ๒ปCC›๐N`๛๔ษคmsnŽธ‘ลญ-› พฦฉgf**สๅยิ๎ษ๕M[๚ hนใจูห‹jBjง๓=หi ๕๒๛๙‹†๊ZTฏvEu1จ6}ีv/ช?„๊OขQํdE?TทrPฝ่๊ป/iTว~ช[(TO"ช/=ชร ช!!๏ู่E๋‹…jžBกT&nDGk4QBน@�ฟข‚๕ๆปฬขงัภำพศ<{7n(4ฒ<55Zc$ฮฮVh”J%ต�&6KNพB>7nhศJeTY#J(Tภ–p8๒+J. ีh’“ƒ‘ิˆjŠีะœ ‘V ‰ว †E&ก Ux_xฃqรƒทฏ !ˆีาv5คฆฆยฏ`๓Žž›ฎง๖™LQXJšจRqƒnขมค‰’Uฉ–Œ3<^RT‡‡/~D็/๘AHฝผ0กPB}-จPdบฆ[†A/ช๑R#ช?…๊๙nŸขิ€๊D5 Q}~จฮฮž|v?ฦธิิ”'ใฅFTJ๓ำว€zyy๚dถQBTŸ ีฉ{{6 Œx…ก�๘|rD๕งใ๓ำฌ–—YX;ฟnT'$PจsW@จN>อฎณณื'๏'ฅge•—ๅxฅฟM(�ฒ0 }Š ~ค์ฦมฒฯU/‘๎๋Eต ๏3๊+Auุฉ๖ญวห‹จP‡F).s ฮ?_รฟwˆjข๚\PB๊…C˜๖ ๚ฯื ณGตL“G)N%ีB๊ H.—|ีRผLจS*9šย '_ทS‘vีฏษฯ;D5 QจFชK8ำœ๊Žพ~ฏc“๔(฿๒rศkสUฟ~>ฆจ‰ฎ]Kฬข”Xj N‡๊ฐ0‰…:oษ…Ÿ€D† ๑BกN%๏$ิ๔รศ้W% ฆ™ฯะไk‚jฏ…Ÿ1ชssShgๅ฿ไีb> u’‡‚j9^(ิฉไ}x‰๏QไœWtแcฆ<๕–๑บ๊7o๖ฯฺU็f"ชQˆjJ็eฒŽAณŽ nช~ี‡<๕๒˜uี๛dXฃซF!ชQจบj๊Q‰ืฉ้ื์/†ึ๓๕‘Ÿ๚–ย๔pีoฮี่ชQˆjŠO๙:K๋๋‡@}ีวX๊ๅๅบบ๏%5ฐ:้@Whิ๙๊งŸD๕OุQงัuฎJฆ^‡?๑ฤจณ๏SฎG?ผ๙z]5~:PˆjิๅA๕qา๙กz๙เdฉ2Y่cด&~6ฆพๅxjโช็?ี"ฑXBI,_ฌ:๛ฉฒช๏>  จK‚๊’f:=สQ&๛๛;›ศŠIจฆ=๕9 :QBTฃP zม8ฝ๓P3ž๚อ›้้ฯCตD:žSA)^ฃ8/W}ทฒ็eN๙(}ขuYPญฃQMGฉsrAอZjฦSฟyใLTKyืาาศ่ฤœอyน๊สงSฅ-ๅx๗Qˆjิ%A๕u€ผง-5<๐๖ท}ฎฅf\ตฯT๏;O�ั"/y‚๙Y้ ””ƒ๊\\๕O?|ณpฐ)ืีRA‚ฦ+…>Mzน‘)e<2‰‚) ๅRพ(!Aษ”ๅz1_’ภnฎ‘HD|ฝยปบRฉภฬB…’)'@hGœ d7‰$ฃ’].#cHู<‘X"ๅ”ล|ฑTฮฎn4ยI ย˜ลษ au๊๊F๊.ฒ $+ฟs1ฒ›+y<๑ฝฏlCTJfLfสWฤpe?XwฅR�ม,){ชJฅ„/–่Ÿ‹ฏ๎ ๗แฬw๐0=ฉ;็>ภ๎ศฃ*นu๓จปˆSwฅT*๒ุT O๐ี๐ๅ[ฮ#ก8ถ๎ …๎นBqU,BTฃพ.W=}ภ˜๊พŸฉ~ฺ—PM๋)P-yวธบ๒™))4ŒKีฺsqีขปw‹sn๗\+็ข:Lก}เ•Zฃ$gส1šh>_ฃQ3e•RศkตyLY 4ีkูอbพยเ]VžšิLฃ๖–๓๒ฦ๕z‰D{“<N,ๆ๑ิL9/OCโ๔์ฮ †@ˆPฆ˜#E “๓๒ุ2ิว,ฟฉ๓ซ๛ธฦ่Ww-ฉปJล\ฅ๐yœบ+R~จ]=๏ส•ซ"…ฏlJลl9/Ž2ฐ•QkคRN๓ิ ‰Tส,†s๐%rง๎b>Oฆaฏป๎7๗>ฤiเ\4์นโŒ|1็\f“ๅ|ฉJๅWwy{)$$Hฤฦv๓›กกไ>d*cBัช}ืิ=Fอ^# Yr๓ๆ-oeิBฑ”gdRซyWลˆjิืไช)T{ชนจ~ํ๕ิo8แ7oOŽjqdd%™^ ชฯU‹*+‹sЇใ[ส9๋„ตy^SจN60eญPญTช™ฒJธ‹‹cŠyส่H‚jถLPรl~“Fตู\ญฅPอ๎-Pษ.TณKcbยชูฒV+I ๎ุ2ŸlTฑ[kUPwง๎Fฟบว‘บk4์ๆ*ฃž šs.~([๗<up๐U‘1†<†B๕ธowี์b5 š[wตฺHPญf–฿ผ จp๋.ๆƒฉfW‹T๛๎ƒBตาw.ชh ีบK8็B๊.P๙๎ ™ฅหจ๕‹LFษdweQ็บTk 7™7ชีพsย}ˆfwn0๐ฎขซF}m';๔…4๕@อฒz?d๚ฤจŽสƒ่4QbAฑH๔\๕/##ฅ‰ฆๆ_๙>fญW*E ;Aล–ฃ‚ฦ8ฆฌผ! ศ`Šฺ่PฉHส)GFŠ๘ก*v๓8R6ฦฑ›ฎ^๕ญญU’Œ•ฏl$eถคRษEbฉ€S‹$๚0ถฌับ+ูƒiu7†ยŽ๒<Aภ)พƒ]$œบ' ๎|u—หลข0ปนŠoŒพฒ’@|kวษrญฏ*–Dส}งฆ…ƒ๑ยธ็ย—่พบC฿๗>h๘F โ�Pย9—จ` ?R้;™ŒิW;าB|[kUPi|eช๎œr(๙ฒว9ฤr‚9u—`�๕•น๊๐็w่หAศQOอ ผ๙๛ูฃ:QจFTฃPŸvี๐Dล๏ƒ}ืฏ$ผูปศ9}โๅš‚$Jภ/โช๙ฟ"—w๖";รsJeฒซรe1ทxธ|‡/ฺ}ฟฃ:ธ่H๙ู่๊du?๎\D-๛‹่ฮร›฿น๓‘บ‹NT๗O]šฯซ๛‘s9Rwพ๎ิ3@P_ชIฐ:„เ‡jสS๏าปŸ#Cษี;Šjšท้Y‰_ฤUSz๚คฌ“๕Pg)D5๊ฏuี0ฦ"D๚๋ow|จ~Nก0!QKฉ Mmี•ศ;ฮ้…ณF๕9Vผ๛Tำ€w…จF]W]ข[˜v๒!ฃ ๒…๙พ.EŽŸ  –๋๙!ไ|ฎ๚็ป7ขฎเG!ชQ—ีญv†๐๙!n๊จ5Rr๕ช(Hฝ~ฦจฮdPถจพ๚3OŽขuyPM%L;)…p’?|=Š€pD?1ี๓๓A๒ใQ}\ทbfๆQ-�TเฃPˆjขš๕ี๓ ำ งำo.ฝืoŠ฿ชCœNฒta~>�P‡ฯ้นจVfๆคSJI+T๋ฝหำำ3 0๒.33Ÿ.ฅฅฉฅ<2฿[LWซ|ณiVZ)‡จF!ชQ฿4ชษฃ`�ฒ๓ NฉษSoEwฤ๛dŽฆ……ภ5ํช#นจ–ล็Rส|p“dCลลgาe5ษ ึhnำฅko,ˆง‹น0 _ฆัz7ฝ๖7:{ QBTฃพ]Tcญ 'ึ๚Oฟy?๖ลโŸhTฯาŸจเ๔รgฃบQBTฃีวkช{๑gŠjย๊ท@๊€R๔V‡๔ี"2‘”LuฃคRบt•โ ก—ยX22^IๆขฺQBTฃีิณหงCšKL|๊ ี๓D ฿่ณO,D5 Q๚ถQM=ปฌ฿ํ๛รz?$$PTำ๑๎ƒHฟ"ข…จFกฮีืiW ใ%o฿ํ๏{1ฝ๒ญำป๊……้  ฌFTฃี(ิน ššน)ไช€<ฑFด1Ay€(ชiRจBTฃี(ิ๙ ZGžณ!˜ษR — C…๒H๑ HN‘z๚ว สV#ชQˆj๊| ิPg= กš &ฟC RœุTOำฆr@ี(D5 uๆจ.)aXM 2กฏNจvRฆl5ข…จFกฮี�!ษีญฉqๆิh๒ภณ?ฉiS๔ฃQBTฃPgŽj:ณš8k yj49™ิ#pOอ˜j ชQˆj๊ฌQ}๋ชKจk]ธŽz๘(EŠิ฿ฑ๚QBTฃP็เชu ญKs0ชI—ข“ P:~"ชQˆjขšแ4A๖ P=๏%uHŸ~@Tฃี(ิูขšAดฯU๋N�j*m$่Bี(D5 u–จฆS@h]<�2๏๕QO}.พQBTฃะU๋XWญ+ ะTSค>งf๓@ฮุX#ชQˆjบ๊Vล?ๆร}ž๚ป c๕ใูkIXข…จF}ใฎšสซฆ" นj_๔ใ๛ƒ>ค3…5ข…จF}ฎฺ/ฑ:ภ^E/ฉ?jึg‘…ˆjข๕mปjM๋๋E@ๆนณž~B?~๗ร™๐QBTฃ0�ข;Qฌš<๒๖ปc ๕Cฟฮ=oใ����IENDฎB`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/examples/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0016612�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/examples/__init__.py���������������������������������������������������������0000664�0000000�0000000�00000000041�14677501631�0020716�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Examples for this library.""" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/examples/phases.py�����������������������������������������������������������0000664�0000000�0000000�00000002463�14677501631�0020454�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pylint: disable=W0621 """Asynchronous Python client for the P1 Monitor API.""" import asyncio from p1monitor import P1Monitor, Phases async def main() -> None: """Show example on getting P1 Monitor data.""" async with P1Monitor(host="127.0.0.1") as client: phases: Phases = await client.phases() print(phases) print() print("--- P1 Monitor | Phases ---") print(f"Voltage Phase L1: {phases.voltage_phase_l1}") print(f"Voltage Phase L2: {phases.voltage_phase_l2}") print(f"Voltage Phase L3: {phases.voltage_phase_l3}") print() print(f"Current Phase L1: {phases.current_phase_l1}") print(f"Current Phase L2: {phases.current_phase_l2}") print(f"Current Phase L3: {phases.current_phase_l3}") print() print(f"Power Consumed Phase L1: {phases.power_consumed_phase_l1}") print(f"Power Consumed Phase L2: {phases.power_consumed_phase_l2}") print(f"Power Consumed Phase L3: {phases.power_consumed_phase_l3}") print() print(f"Power Produced Phase L1: {phases.power_produced_phase_l1}") print(f"Power Produced Phase L2: {phases.power_produced_phase_l2}") print(f"Power Produced Phase L3: {phases.power_produced_phase_l3}") if __name__ == "__main__": asyncio.run(main()) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/examples/ruff.toml�����������������������������������������������������������0000664�0000000�0000000�00000000253�14677501631�0020451�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This extend our general Ruff rules specifically for the examples extend = "../pyproject.toml" lint.extend-ignore = [ "T201", # Allow the use of print() in examples ] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/examples/settings.py���������������������������������������������������������0000664�0000000�0000000�00000002045�14677501631�0021025�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pylint: disable=W0621 """Asynchronous Python client for the P1 Monitor API.""" import asyncio from p1monitor import P1Monitor, Settings async def main() -> None: """Show example on getting P1 Monitor data.""" async with P1Monitor(host="127.0.0.1") as client: settings: Settings = await client.settings() print(settings) energy_cons_high = settings.energy_consumption_price_high energy_cons_low = settings.energy_consumption_price_low energy_prod_high = settings.energy_production_price_high energy_prod_low = settings.energy_production_price_low print() print("--- P1 Monitor | Settings ---") print(f"Gas Price: {settings.gas_consumption_price}") print(f"Energy Consumption Price - High: {energy_cons_high}") print(f"Energy Consumption Price - Low: {energy_cons_low}") print(f"Energy Production Price - High: {energy_prod_high}") print(f"Energy Production Price - Low: {energy_prod_low}") if __name__ == "__main__": asyncio.run(main()) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/examples/smartmeter.py�������������������������������������������������������0000664�0000000�0000000�00000002110�14677501631�0021341�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pylint: disable=W0621 """Asynchronous Python client for the P1 Monitor API.""" import asyncio from p1monitor import P1Monitor, SmartMeter async def main() -> None: """Show example on getting P1 Monitor data.""" async with P1Monitor(host="127.0.0.1") as client: smartmeter: SmartMeter = await client.smartmeter() print(smartmeter) print() print("--- P1 Monitor | SmartMeter ---") print(f"Power Consumption: {smartmeter.power_consumption}") print(f"Energy Consumption - High: {smartmeter.energy_consumption_high}") print(f"Energy Consumption - Low: {smartmeter.energy_consumption_low}") print() print(f"Power Production: {smartmeter.power_production}") print(f"Energy Production - High: {smartmeter.energy_production_high}") print(f"Energy Production - Low: {smartmeter.energy_production_low}") print(f"Energy Tariff: {smartmeter.energy_tariff_period}") print() print(f"Gas Consumption: {smartmeter.gas_consumption}") if __name__ == "__main__": asyncio.run(main()) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/examples/watermeter.py�������������������������������������������������������0000664�0000000�0000000�00000001233�14677501631�0021342�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pylint: disable=W0621 """Asynchronous Python client for the P1 Monitor API.""" import asyncio from p1monitor import P1Monitor, WaterMeter async def main() -> None: """Show example on getting P1 Monitor data.""" async with P1Monitor(host="127.0.0.1") as client: watermeter: WaterMeter = await client.watermeter() print(watermeter) print() print("--- P1 Monitor | WaterMeter ---") print(f"Consumption Day: {watermeter.consumption_day}") print(f"Consumption Total: {watermeter.consumption_total}") print(f"Pulse Count: {watermeter.pulse_count}") if __name__ == "__main__": asyncio.run(main()) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/poetry.lock������������������������������������������������������������������0000664�0000000�0000000�00000331025�14677501631�0017174�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" version = "3.10.8" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, ] [package.dependencies] aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.7" files = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, ] [package.dependencies] frozenlist = ">=1.1.0" [[package]] name = "aresponses" version = "3.0.0" description = "Asyncio response mocking. Similar to the responses library used for 'requests'" optional = false python-versions = ">=3.7" files = [ {file = "aresponses-3.0.0-py3-none-any.whl", hash = "sha256:8093ab4758eb4aba91c765a50295b269ecfc0a9e7c7158954760bc0c23503970"}, {file = "aresponses-3.0.0.tar.gz", hash = "sha256:8731d0609fe4c954e21f17753dc868dca9e2e002b020a33dc9212004599b11e7"}, ] [package.dependencies] aiohttp = [ {version = ">=3.7.0,<3.8.dev0 || >=3.9.dev0", markers = "python_version >= \"3.12\""}, {version = ">=3.7.0", markers = "python_version >= \"3.10\" and python_version < \"3.12\""}, ] pytest-asyncio = {version = ">=0.17.0", markers = "python_version >= \"3.7\""} [[package]] name = "astroid" version = "3.3.4" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.9.0" files = [ {file = "astroid-3.3.4-py3-none-any.whl", hash = "sha256:5eba185467253501b62a9f113c263524b4f5d55e1b30456370eed4cdbd6438fd"}, {file = "astroid-3.3.4.tar.gz", hash = "sha256:e73d0b62dd680a7c07cb2cd0ce3c22570b044dd01bd994bc3a2dd16c6cbba162"}, ] [[package]] name = "attrs" version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[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 = "codespell" version = "2.3.0" description = "Codespell" optional = false python-versions = ">=3.8" files = [ {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, ] [package.extras] dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] hard-encoding-detection = ["chardet"] toml = ["tomli"] types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." 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 = "covdefaults" version = "2.3.0" description = "A coverage plugin to provide sensible default settings" optional = false python-versions = ">=3.7" files = [ {file = "covdefaults-2.3.0-py2.py3-none-any.whl", hash = "sha256:2832961f6ffcfe4b57c338bc3418a3526f495c26fb9c54565409c5532f7c41be"}, {file = "covdefaults-2.3.0.tar.gz", hash = "sha256:4e99f679f12d792bc62e5510fa3eb59546ed47bd569e36e4fddc4081c9c3ebf7"}, ] [package.dependencies] coverage = ">=6.0.2" [[package]] name = "coverage" version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.extras] toml = ["tomli"] [[package]] name = "dill" version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distlib" version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] name = "filelock" version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "frozenlist" version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] name = "identify" version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] license = ["ukkonen"] [[package]] name = "idna" version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false 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.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] colors = ["colorama (>=0.4.6)"] [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] name = "multidict" version = "6.1.0" description = "multidict implementation" optional = false python-versions = ">=3.8" files = [ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, ] [[package]] name = "mypy" version = "1.11.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false 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.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] [[package]] name = "packaging" version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "platformdirs" version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, ] [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" [[package]] name = "pre-commit-hooks" version = "4.6.0" description = "Some out-of-the-box hooks for pre-commit." optional = false python-versions = ">=3.8" files = [ {file = "pre_commit_hooks-4.6.0-py2.py3-none-any.whl", hash = "sha256:a69199e6a2d45ec59c1020a81ca1549abddc2afb798276d9a0d951752d6abbfe"}, {file = "pre_commit_hooks-4.6.0.tar.gz", hash = "sha256:eb1f43ee67869cd41b4c59017fad4a0f9d4d61201d163f2135535aaf65035a2b"}, ] [package.dependencies] "ruamel.yaml" = ">=0.15" [[package]] name = "pylint" version = "3.3.1" description = "python code static checker" optional = false python-versions = ">=3.9.0" files = [ {file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"}, {file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"}, ] [package.dependencies] astroid = ">=3.3.4,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomlkit = ">=0.10.1" [package.extras] spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] [[package]] name = "pytest" version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" pluggy = ">=1.5,<2" [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, ] [package.dependencies] pytest = ">=8.2,<9" [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-cov" version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pyyaml" version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "ruamel-yaml" version = "0.18.6" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.7" files = [ {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, ] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false python-versions = ">=3.6" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, ] [[package]] name = "ruff" version = "0.6.8" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ {file = "ruff-0.6.8-py3-none-linux_armv6l.whl", hash = "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2"}, {file = "ruff-0.6.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c"}, {file = "ruff-0.6.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5"}, {file = "ruff-0.6.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f"}, {file = "ruff-0.6.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb"}, {file = "ruff-0.6.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f"}, {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0"}, {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87"}, {file = "ruff-0.6.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098"}, {file = "ruff-0.6.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0"}, {file = "ruff-0.6.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750"}, {file = "ruff-0.6.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce"}, {file = "ruff-0.6.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa"}, {file = "ruff-0.6.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44"}, {file = "ruff-0.6.8-py3-none-win32.whl", hash = "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a"}, {file = "ruff-0.6.8-py3-none-win_amd64.whl", hash = "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263"}, {file = "ruff-0.6.8-py3-none-win_arm64.whl", hash = "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc"}, {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"}, ] [[package]] name = "syrupy" version = "4.7.1" description = "Pytest Snapshot Test Utility" optional = false python-versions = ">=3.8.1" files = [ {file = "syrupy-4.7.1-py3-none-any.whl", hash = "sha256:be002267a512a4bedddfae2e026c93df1ea928ae10baadc09640516923376d41"}, {file = "syrupy-4.7.1.tar.gz", hash = "sha256:f9d4485f3f27d0e5df6ed299cac6fa32eb40a441915d988e82be5a4bdda335c8"}, ] [package.dependencies] pytest = ">=7.0.0,<9.0.0" [[package]] name = "tomlkit" version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] name = "typing-extensions" version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "virtualenv" version = "20.26.6" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, ] [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,!=7.3)", "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 = "yamllint" version = "1.35.1" description = "A linter for YAML files." optional = false python-versions = ">=3.8" files = [ {file = "yamllint-1.35.1-py3-none-any.whl", hash = "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3"}, {file = "yamllint-1.35.1.tar.gz", hash = "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd"}, ] [package.dependencies] pathspec = ">=0.5.3" pyyaml = "*" [package.extras] dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] [[package]] name = "yarl" version = "1.13.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.11" content-hash = "aee0a3547e9698399ad3b8d1168d7c02ad906ab66a75648733faffef09deefad" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/pyproject.toml���������������������������������������������������������������0000664�0000000�0000000�00000007437�14677501631�0017723�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[tool.poetry] name = "p1monitor" version = "0.0.0" description = "Asynchronous Python client for the P1 Monitor" authors = ["Klaas Schoute <hello@student-techlife.com>"] maintainers = ["Klaas Schoute <hello@student-techlife.com>"] license = "MIT" readme = "README.md" homepage = "https://github.com/klaasnicolaas/python-p1monitor" repository = "https://github.com/klaasnicolaas/python-p1monitor" documentation = "https://github.com/klaasnicolaas/python-p1monitor" keywords = ["p1", "monitor", "power", "energy", "api", "async", "client"] classifiers = [ "Development Status :: 5 - Production/Stable", "Framework :: AsyncIO", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules", ] packages = [ { include = "p1monitor", from = "src"}, ] [tool.poetry.dependencies] aiohttp = ">=3.0.0" python = "^3.11" yarl = ">=1.6.0" [tool.poetry.urls] "Bug Tracker" = "https://github.com/klaasnicolaas/python-p1monitor/issues" Changelog = "https://github.com/klaasnicolaas/python-p1monitor/releases" [tool.poetry.group.dev.dependencies] aresponses = "3.0.0" codespell = "2.3.0" covdefaults = "2.3.0" coverage = {version = "7.6.1", extras = ["toml"]} mypy = "1.11.2" pre-commit = "3.8.0" pre-commit-hooks = "4.6.0" pylint = "3.3.1" pytest = "8.3.3" pytest-asyncio = "0.24.0" pytest-cov = "5.0.0" ruff = "0.6.8" syrupy = "4.7.1" yamllint = "1.35.1" [tool.coverage.run] plugins = ["covdefaults"] source = ["p1monitor"] [tool.coverage.report] fail_under = 90 show_missing = true [tool.mypy] # Specify the target platform details in config, so your developers are # free to run mypy on Windows, Linux, or macOS and get consistent # results. platform = "linux" python_version = "3.11" # flake8-mypy expects the two following for sensible formatting show_column_numbers = true # show error messages from unrelated files follow_imports = "normal" # suppress errors about unsatisfied imports ignore_missing_imports = true # be strict check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_subclassing_any = true disallow_untyped_calls = true disallow_untyped_decorators = true disallow_untyped_defs = true no_implicit_optional = true no_implicit_reexport = true strict_optional = true warn_incomplete_stub = true warn_no_return = true warn_redundant_casts = true warn_return_any = true warn_unused_configs = true warn_unused_ignores = true [tool.pylint.BASIC] good-names = ["_", "ex", "fp", "i", "id", "j", "k", "on", "Run", "T"] [tool.pylint."MESSAGES CONTROL"] disable= [ "duplicate-code", "format", "unsubscriptable-object", ] [tool.pylint.SIMILARITIES] ignore-imports = true [tool.pylint.FORMAT] max-line-length = 88 [tool.pylint.DESIGN] max-attributes = 15 [tool.pytest.ini_options] addopts = "--cov" asyncio_mode = "auto" [tool.ruff] target-version = "py311" lint.select = ["ALL"] lint.ignore = [ "ANN101", # Self... explanatory "ANN102", # cls... just as useless "ANN401", # Opinioated warning on disallowing dynamically typed expressions "D203", # Conflicts with other rules "D213", # Conflicts with other rules "D417", # False positives in some occasions "PLR2004", # Just annoying, not really useful "SLOT000", # Has a bug with enums: https://github.com/astral-sh/ruff/issues/5748 # Conflicts with the Ruff formatter "COM812", "ISC001", ] [tool.ruff.lint.flake8-pytest-style] mark-parentheses = false fixture-parentheses = false [tool.ruff.lint.isort] known-first-party = ["p1monitor"] [tool.ruff.lint.mccabe] max-complexity = 25 [build-system] build-backend = "poetry.core.masonry.api" requires = ["poetry-core>=1.0.0"] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/src/�������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0015563�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/src/p1monitor/���������������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0017513�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/src/p1monitor/__init__.py����������������������������������������������������0000664�0000000�0000000�00000000643�14677501631�0021627�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Asynchronous Python client for the P1 Monitor API.""" from .exceptions import P1MonitorConnectionError, P1MonitorError, P1MonitorNoDataError from .models import Phases, Settings, SmartMeter, WaterMeter from .p1monitor import P1Monitor __all__ = [ "P1Monitor", "P1MonitorError", "P1MonitorConnectionError", "P1MonitorNoDataError", "SmartMeter", "Settings", "Phases", "WaterMeter", ] ���������������������������������������������������������������������������������������������python-p1monitor-3.1.0/src/p1monitor/exceptions.py��������������������������������������������������0000664�0000000�0000000�00000000437�14677501631�0022252�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Exceptions for P1 Monitor.""" class P1MonitorError(Exception): """Generic P1 Monitor exception.""" class P1MonitorConnectionError(P1MonitorError): """P1 Monitor connection exception.""" class P1MonitorNoDataError(P1MonitorError): """P1 Monitor no data exception.""" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/src/p1monitor/models.py������������������������������������������������������0000664�0000000�0000000�00000014221�14677501631�0021350�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Models for P1 Monitor.""" from __future__ import annotations from dataclasses import dataclass from enum import Enum from typing import Any class EnergyTariff(str, Enum): """Enumeration representing the rate period.""" __slots__ = () LOW = "low" HIGH = "high" @dataclass class SmartMeter: """Object representing an SmartMeter response from P1 Monitor.""" gas_consumption: float | None energy_tariff_period: str | None power_consumption: int | None energy_consumption_high: float | None energy_consumption_low: float | None power_production: int | None energy_production_high: float | None energy_production_low: float | None @staticmethod def from_dict(data: dict[str | int, Any]) -> SmartMeter: """Return SmartMeter object from the P1 Monitor API response. Args: ---- data: The data from the P1 Monitor API. Returns: ------- A SmartMeter object. """ def energy_tariff(tariff: str) -> EnergyTariff: """Return API energy_tariff information. Args: ---- tariff: The provided tariff code from the API. Returns: ------- The energy tariff period class. """ if tariff == "P": return EnergyTariff.HIGH return EnergyTariff.LOW data = data[0] return SmartMeter( gas_consumption=data.get("CONSUMPTION_GAS_M3"), power_consumption=data.get("CONSUMPTION_W"), energy_consumption_high=data.get("CONSUMPTION_KWH_HIGH"), energy_consumption_low=data.get("CONSUMPTION_KWH_LOW"), power_production=data.get("PRODUCTION_W"), energy_production_high=data.get("PRODUCTION_KWH_HIGH"), energy_production_low=data.get("PRODUCTION_KWH_LOW"), energy_tariff_period=energy_tariff(str(data.get("TARIFCODE"))), ) @dataclass class Settings: """Object representing an Settings response from P1 Monitor.""" gas_consumption_price: float | None energy_consumption_price_high: float | None energy_consumption_price_low: float | None energy_production_price_high: float | None energy_production_price_low: float | None @staticmethod def from_dict(data: dict[str, Any]) -> Settings: """Return Settings object from the P1 Monitor API response. Args: ---- data: The data from the P1 Monitor API. Returns: ------- A Settings object. """ return Settings( gas_consumption_price=search(15, data, "conf"), energy_consumption_price_low=search(1, data, "conf"), energy_consumption_price_high=search(2, data, "conf"), energy_production_price_low=search(3, data, "conf"), energy_production_price_high=search(4, data, "conf"), ) @dataclass class Phases: """Object representing an Phases response from P1 Monitor.""" voltage_phase_l1: float | None voltage_phase_l2: float | None voltage_phase_l3: float | None current_phase_l1: float | None current_phase_l2: float | None current_phase_l3: float | None power_consumed_phase_l1: int | None power_consumed_phase_l2: int | None power_consumed_phase_l3: int | None power_produced_phase_l1: int | None power_produced_phase_l2: int | None power_produced_phase_l3: int | None @staticmethod def from_dict(data: dict[str | int, Any]) -> Phases: """Return Phases object from the P1 Monitor API response. Args: ---- data: The data from the P1 Monitor API. Returns: ------- A Phases object. """ return Phases( voltage_phase_l1=search(103, data, "status"), voltage_phase_l2=search(104, data, "status"), voltage_phase_l3=search(105, data, "status"), current_phase_l1=search(100, data, "status"), current_phase_l2=search(101, data, "status"), current_phase_l3=search(102, data, "status"), power_consumed_phase_l1=convert(search(74, data, "status")), power_consumed_phase_l2=convert(search(75, data, "status")), power_consumed_phase_l3=convert(search(76, data, "status")), power_produced_phase_l1=convert(search(77, data, "status")), power_produced_phase_l2=convert(search(78, data, "status")), power_produced_phase_l3=convert(search(79, data, "status")), ) @dataclass class WaterMeter: """Object representing an WaterMeter response from P1 Monitor.""" consumption_day: int | None consumption_total: float | None pulse_count: int | None @staticmethod def from_dict(data: dict[str | int, Any]) -> WaterMeter: """Return WaterMeter object from the P1 Monitor API response. Args: ---- data: The data from the P1 Monitor API. Returns: ------- A WaterMeter object. """ data = data[0] return WaterMeter( consumption_day=data.get("WATERMETER_CONSUMPTION_LITER"), consumption_total=data.get("WATERMETER_CONSUMPTION_TOTAL_M3"), pulse_count=data.get("WATERMETER_PULS_COUNT"), ) def search(position: int, data: Any, service: str) -> float: """Find the correct value in the json data file. Args: ---- position: The position ID number. data: The JSON list which is requested from the API. service: Type of dataclass. Returns: ------- The value that corresponds to the specified position. """ value: float for i in data: if service == "conf" and i["CONFIGURATION_ID"] == position: value = float(i["PARAMETER"]) elif service == "status" and i["STATUS_ID"] == position: value = float(i["STATUS"]) return value def convert(value: float) -> int: """Convert values from kW to W. Args: ---- value: The current value. Returns: ------- Value in Watt (W). """ return int(float(value) * 1000) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/src/p1monitor/p1monitor.py���������������������������������������������������0000664�0000000�0000000�00000012555�14677501631�0022025�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Asynchronous Python client for the P1 Monitor API.""" from __future__ import annotations import asyncio import socket from dataclasses import dataclass from importlib import metadata from typing import Any, Self, cast from aiohttp import ClientError, ClientSession from aiohttp.hdrs import METH_GET from yarl import URL from .exceptions import P1MonitorConnectionError, P1MonitorError, P1MonitorNoDataError from .models import Phases, Settings, SmartMeter, WaterMeter VERSION = metadata.version(__package__) @dataclass class P1Monitor: """Main class for handling connections with the P1 Monitor API.""" host: str port: int = 80 request_timeout: float = 10.0 session: ClientSession | None = None _close_session: bool = False async def _request( self, uri: str, *, method: str = METH_GET, params: dict[str, Any] | None = None, ) -> Any: """Handle a request to a P1 Monitor device. Args: ---- uri: Request URI, without '/api/', for example, 'status' method: HTTP Method to use. params: Extra options to improve or limit the response. Returns: ------- A Python dictionary (JSON decoded) with the response from the P1 Monitor API. Raises: ------ P1MonitorConnectionError: An error occurred while communicating with the P1 Monitor. P1MonitorError: Received an unexpected response from the P1 Monitor API. """ url = URL.build( scheme="http", host=self.host, port=self.port, path="/api/", ).join(URL(uri)) headers = { "User-Agent": f"PythonP1Monitor/{VERSION}", "Accept": "application/json, text/plain, */*", } if self.session is None: self.session = ClientSession() self._close_session = True try: async with asyncio.timeout(self.request_timeout): response = await self.session.request( method, url, params=params, headers=headers, ) response.raise_for_status() except TimeoutError as exception: msg = "Timeout occurred while connecting to P1 Monitor device" raise P1MonitorConnectionError( msg, ) from exception except (ClientError, socket.gaierror) as exception: if "watermeter" in uri and response.status == 404: msg = "No water meter is connected to P1 Monitor device" raise P1MonitorConnectionError(msg) from exception msg = "Error occurred while communicating with P1 Monitor device" raise P1MonitorConnectionError(msg) from exception content_type = response.headers.get("Content-Type", "") if "application/json" not in content_type: text = await response.text() msg = "Unexpected response from the P1 Monitor device" raise P1MonitorError( msg, {"Content-Type": content_type, "response": text}, ) return cast(dict[str, Any], await response.json()) async def smartmeter(self) -> SmartMeter: """Get the latest values from you smart meter. Returns ------- A SmartMeter data object from the P1 Monitor API. """ data = await self._request( "v1/smartmeter", params={"json": "object", "limit": 1}, ) return SmartMeter.from_dict(data) async def settings(self) -> Settings: """Receive the set price values for energy and gas. Returns ------- A Settings data object from the P1 Monitor API. """ data = await self._request("v1/configuration", params={"json": "object"}) return Settings.from_dict(data) async def phases(self) -> Phases: """Receive data from all phases on your smart meter. Returns ------- A Phases data object from the P1 Monitor API. """ data = await self._request("v1/status", params={"json": "object"}) return Phases.from_dict(data) async def watermeter(self) -> WaterMeter: """Get the latest values from you water meter. Returns ------- A WaterMeter data object from the P1 Monitor API. Raises ------ P1MonitorNoDataError: No data was received from the P1 Monitor API. """ data = await self._request( "v2/watermeter/day", params={"json": "object", "limit": 1}, ) if data == []: msg = "No data received from P1 Monitor" raise P1MonitorNoDataError(msg) return WaterMeter.from_dict(data) async def close(self) -> None: """Close open client session.""" if self.session and self._close_session: await self.session.close() async def __aenter__(self) -> Self: """Async enter. Returns ------- The P1 Monitor object. """ return self async def __aexit__(self, *_exc_info: object) -> None: """Async exit. Args: ---- _exc_info: Exec type. """ await self.close() ���������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/src/p1monitor/py.typed�������������������������������������������������������0000664�0000000�0000000�00000000000�14677501631�0021200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/�����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0016136�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/__init__.py������������������������������������������������������������0000664�0000000�0000000�00000000351�14677501631�0020246�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Asynchronous Python client for the P1 Monitor.""" from pathlib import Path def load_fixtures(filename: str) -> str: """Load a fixture.""" path = Path(__file__).parent / "fixtures" / filename return path.read_text() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/__snapshots__/���������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0020754�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/__snapshots__/test_models.ambr�����������������������������������������0000664�0000000�0000000�00000001730�14677501631�0024142�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# serializer version: 1 # name: test_phases Phases(voltage_phase_l1=229.0, voltage_phase_l2=0.0, voltage_phase_l3=0.0, current_phase_l1=4.0, current_phase_l2=0.0, current_phase_l3=0.0, power_consumed_phase_l1=863, power_consumed_phase_l2=0, power_consumed_phase_l3=0, power_produced_phase_l1=0, power_produced_phase_l2=0, power_produced_phase_l3=0) # --- # name: test_settings Settings(gas_consumption_price=0.86687, energy_consumption_price_high=0.24388, energy_consumption_price_low=0.22311, energy_production_price_high=0.24388, energy_production_price_low=0.22311) # --- # name: test_smartmeter SmartMeter(gas_consumption=2289.967, energy_tariff_period=<EnergyTariff.LOW: 'low'>, power_consumption=935, energy_consumption_high=2996.141, energy_consumption_low=5436.256, power_production=0, energy_production_high=4408.947, energy_production_low=1575.502) # --- # name: test_watermeter WaterMeter(consumption_day=128.0, consumption_total=1640.399, pulse_count=128.0) # --- ����������������������������������������python-p1monitor-3.1.0/tests/conftest.py������������������������������������������������������������0000664�0000000�0000000�00000000734�14677501631�0020341�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Fixture for the P1Monitor tests.""" from collections.abc import AsyncGenerator import pytest from aiohttp import ClientSession from p1monitor import P1Monitor @pytest.fixture(name="p1monitor_client") async def client() -> AsyncGenerator[P1Monitor, None]: """Return a P1Monitor client.""" async with ( ClientSession() as session, P1Monitor(host="192.168.1.2", port=80, session=session) as p1monitor_client, ): yield p1monitor_client ������������������������������������python-p1monitor-3.1.0/tests/fixtures/��������������������������������������������������������������0000775�0000000�0000000�00000000000�14677501631�0020007�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/fixtures/no_data.json��������������������������������������������������0000664�0000000�0000000�00000000003�14677501631�0022300�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/fixtures/phases.json���������������������������������������������������0000664�0000000�0000000�00000003144�14677501631�0022167�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[ { "LABEL": "Huidige KW verbruik L1 (21.7.0)", "SECURITY": 0, "STATUS": "0.863", "STATUS_ID": 74 }, { "LABEL": "Huidige KW verbruik L2 (41.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 75 }, { "LABEL": "Huidige KW verbruik L3 (61.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 76 }, { "LABEL": "Huidige KW levering L1 (22.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 77 }, { "LABEL": "Huidige KW levering L2 (42.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 78 }, { "LABEL": "Huidige KW levering L3 (62.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 79 }, { "LABEL": "Huidige Amperage L1 (31.7.0)", "SECURITY": 0, "STATUS": "4.0", "STATUS_ID": 100 }, { "LABEL": "Huidige Amperage L2 (51.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 101 }, { "LABEL": "Huidige Amperage L2 (71.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 102 }, { "LABEL": "Huidige Voltage L1 (32.7.0)", "SECURITY": 0, "STATUS": "229.0", "STATUS_ID": 103 }, { "LABEL": "Huidige Voltage L2 (52.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 104 }, { "LABEL": "Huidige Voltage L2 (72.7.0)", "SECURITY": 0, "STATUS": "0.0", "STATUS_ID": 105 } ] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/fixtures/settings.json�������������������������������������������������0000664�0000000�0000000�00000001276�14677501631�0022550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[ { "CONFIGURATION_ID": 1, "LABEL": "Verbruik tarief elektriciteit dal/nacht in euro.", "PARAMETER": "0.22311" }, { "CONFIGURATION_ID": 2, "LABEL": "Verbruik tarief elektriciteit piek/dag in euro.", "PARAMETER": "0.24388" }, { "CONFIGURATION_ID": 3, "LABEL": "Geleverd tarief elektriciteit dal/nacht in euro.", "PARAMETER": "0.22311" }, { "CONFIGURATION_ID": 4, "LABEL": "Geleverd tarief elektriciteit piek/dag in euro.", "PARAMETER": "0.24388" }, { "CONFIGURATION_ID": 15, "LABEL": "Verbruik tarief gas in euro.", "PARAMETER": "0.86687" } ] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/fixtures/smartmeter.json�����������������������������������������������0000664�0000000�0000000�00000000503�14677501631�0023063�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[{"CONSUMPTION_GAS_M3": 2289.967, "CONSUMPTION_KWH_HIGH": 2996.141, "CONSUMPTION_KWH_LOW": 5436.256, "CONSUMPTION_W": 935, "PRODUCTION_KWH_HIGH": 4408.947, "PRODUCTION_KWH_LOW": 1575.502, "PRODUCTION_W": 0, "RECORD_IS_PROCESSED": 0, "TARIFCODE": "D", "TIMESTAMP_UTC": 1633130812, "TIMESTAMP_lOCAL": "2021-10-02 01:26:52"}] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/fixtures/watermeter.json�����������������������������������������������0000664�0000000�0000000�00000000323�14677501631�0023057�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[{"TIMEPERIOD_ID": 13, "TIMESTAMP_UTC": 1644620400, "TIMESTAMP_lOCAL": "2022-02-12 00:00:00", "WATERMETER_CONSUMPTION_LITER": 128.0, "WATERMETER_CONSUMPTION_TOTAL_M3": 1640.399, "WATERMETER_PULS_COUNT": 128.0}] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/ruff.toml��������������������������������������������������������������0000664�0000000�0000000�00000000544�14677501631�0020000�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This extend our general Ruff rules specifically for tests extend = "../pyproject.toml" lint.extend-select = [ "PT", # Use @pytest.fixture without parentheses ] lint.extend-ignore = [ "S101", # Use of assert detected. As these are tests... "SLF001", # Tests will access private/protected members... "TCH002", # pytest doesn't like this one... ] ������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/test_exceptions.py�����������������������������������������������������0000664�0000000�0000000�00000004015�14677501631�0021730�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Exceptions tests for the P1Monitor device.""" # pylint: disable=protected-access import pytest from aresponses import ResponsesMockServer from p1monitor import P1Monitor from p1monitor.exceptions import P1MonitorConnectionError, P1MonitorError @pytest.mark.parametrize("status", [401, 403]) async def test_http_error401( aresponses: ResponsesMockServer, p1monitor_client: P1Monitor, status: int, ) -> None: """Test HTTP 401 response handling.""" aresponses.add( "192.168.1.2", "/api/v1/smartmeter", "GET", aresponses.Response(text="Give me energy!", status=status), ) with pytest.raises(P1MonitorConnectionError): assert await p1monitor_client._request("test") async def test_http_error404( aresponses: ResponsesMockServer, p1monitor_client: P1Monitor, ) -> None: """Test HTTP 404 response handling.""" aresponses.add( "192.168.1.2", "/api/v1/smartmeter", "GET", aresponses.Response(text="Give me energy!", status=404), ) with pytest.raises(P1MonitorError): assert await p1monitor_client._request("test") async def test_http_error500( aresponses: ResponsesMockServer, p1monitor_client: P1Monitor, ) -> None: """Test HTTP 500 response handling.""" aresponses.add( "192.168.1.2", "/api/v1/smartmeter", "GET", aresponses.Response( body=b'{"status":"nok"}', status=500, ), ) with pytest.raises(P1MonitorError): assert await p1monitor_client._request("test") async def test_no_success( aresponses: ResponsesMockServer, p1monitor_client: P1Monitor, ) -> None: """Test a message without a success message throws.""" aresponses.add( "192.168.1.2", "/api/v1/smartmeter", "GET", aresponses.Response( status=200, text='{"message": "no success"}', ), ) with pytest.raises(P1MonitorError): assert await p1monitor_client._request("test") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/test_models.py���������������������������������������������������������0000664�0000000�0000000�00000007442�14677501631�0021041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Test the models.""" import pytest from aiohttp import ClientSession from aresponses import ResponsesMockServer from syrupy.assertion import SnapshotAssertion from p1monitor import ( P1Monitor, P1MonitorConnectionError, P1MonitorNoDataError, Phases, Settings, SmartMeter, WaterMeter, ) from . import load_fixtures async def test_smartmeter( aresponses: ResponsesMockServer, snapshot: SnapshotAssertion, p1monitor_client: P1Monitor, ) -> None: """Test request from a P1 Monitor device - SmartMeter object.""" aresponses.add( "192.168.1.2", "/api/v1/smartmeter", "GET", aresponses.Response( text=load_fixtures("smartmeter.json"), status=200, headers={"Content-Type": "application/json; charset=utf-8"}, ), ) smartmeter: SmartMeter = await p1monitor_client.smartmeter() assert smartmeter == snapshot async def test_phases( aresponses: ResponsesMockServer, snapshot: SnapshotAssertion, p1monitor_client: P1Monitor, ) -> None: """Test request from a P1 Monitor device - Phases object.""" aresponses.add( "192.168.1.2", "/api/v1/status", "GET", aresponses.Response( text=load_fixtures("phases.json"), status=200, headers={"Content-Type": "application/json; charset=utf-8"}, ), ) phases: Phases = await p1monitor_client.phases() assert phases == snapshot async def test_watermeter( aresponses: ResponsesMockServer, snapshot: SnapshotAssertion, p1monitor_client: P1Monitor, ) -> None: """Test request from a P1 Monitor device - WaterMeter object.""" aresponses.add( "192.168.1.2", "/api/v2/watermeter/day", "GET", aresponses.Response( text=load_fixtures("watermeter.json"), status=200, headers={"Content-Type": "application/json; charset=utf-8"}, ), ) watermeter: WaterMeter = await p1monitor_client.watermeter() assert watermeter == snapshot async def test_no_watermeter_data_new(aresponses: ResponsesMockServer) -> None: """Test no WaterMeter data from P1 Monitor device.""" aresponses.add( "192.168.1.2", "/api/v2/watermeter/day", "GET", aresponses.Response( text=load_fixtures("no_data.json"), status=200, headers={"Content-Type": "application/json; charset=utf-8"}, ), ) async with ClientSession() as session: client = P1Monitor(host="192.168.1.2", session=session) with pytest.raises(P1MonitorNoDataError): await client.watermeter() async def test_no_watermeter_data_old(aresponses: ResponsesMockServer) -> None: """Test no WaterMeter data from P1 Monitor device.""" aresponses.add( "192.168.1.2", "/api/v2/watermeter/day", "GET", aresponses.Response( status=404, headers={"Content-Type": "application/json; charset=utf-8"}, ), ) async with ClientSession() as session: client = P1Monitor(host="192.168.1.2", session=session) with pytest.raises(P1MonitorConnectionError): await client.watermeter() async def test_settings( aresponses: ResponsesMockServer, snapshot: SnapshotAssertion, p1monitor_client: P1Monitor, ) -> None: """Test request from a P1 Monitor device - Settings object.""" aresponses.add( "192.168.1.2", "/api/v1/configuration", "GET", aresponses.Response( text=load_fixtures("settings.json"), status=200, headers={"Content-Type": "application/json; charset=utf-8"}, ), ) settings: Settings = await p1monitor_client.settings() assert settings == snapshot ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������python-p1monitor-3.1.0/tests/test_p1monitor.py������������������������������������������������������0000664�0000000�0000000�00000006752�14677501631�0021511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Basic tests for the P1Monitor device.""" # pylint: disable=protected-access import asyncio from unittest.mock import patch import pytest from aiohttp import ClientError, ClientResponse, ClientSession from aresponses import Response, ResponsesMockServer from p1monitor import P1Monitor from p1monitor.exceptions import P1MonitorConnectionError, P1MonitorError from . import load_fixtures async def test_json_request( aresponses: ResponsesMockServer, p1monitor_client: P1Monitor, ) -> None: """Test JSON response is handled correctly.""" aresponses.add( "192.168.1.2", "/api/test", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/json"}, text='{"status": "ok"}', ), ) response = await p1monitor_client._request("test") assert response is not None await p1monitor_client.close() async def test_different_port(aresponses: ResponsesMockServer) -> None: """Test different port is handled correctly.""" aresponses.add( "192.168.1.2:84", "/api/test", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/json"}, text='{"status": "ok"}', ), ) async with ClientSession() as session: p1monitor = P1Monitor("192.168.1.2", port=84, session=session) await p1monitor._request("test") await p1monitor.close() async def test_internal_session(aresponses: ResponsesMockServer) -> None: """Test JSON response is handled correctly.""" aresponses.add( "192.168.1.2", "/api/test", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/json"}, text='{"status": "ok"}', ), ) async with P1Monitor("192.168.1.2") as p1monitor: await p1monitor._request("test") async def test_timeout(aresponses: ResponsesMockServer) -> None: """Test request timeout from P1 Monitor.""" # Faking a timeout by sleeping async def reponse_handler(_: ClientResponse) -> Response: await asyncio.sleep(0.2) return aresponses.Response( body="Goodmorning!", text=load_fixtures("smartmeter.json"), ) aresponses.add("192.168.1.2", "/api/test", "GET", reponse_handler) async with ClientSession() as session: client = P1Monitor(host="192.168.1.2", session=session, request_timeout=0.1) with pytest.raises(P1MonitorConnectionError): assert await client._request("test") async def test_content_type( aresponses: ResponsesMockServer, p1monitor_client: P1Monitor, ) -> None: """Test request content type error from P1 Monitor.""" aresponses.add( "192.168.1.2", "/api/test", "GET", aresponses.Response( status=200, headers={"Content-Type": "blabla/blabla"}, ), ) with pytest.raises(P1MonitorError): assert await p1monitor_client._request("test") async def test_client_error() -> None: """Test request client error from P1 Monitor.""" async with ClientSession() as session: client = P1Monitor(host="192.168.1.2", session=session) with ( patch.object( session, "request", side_effect=ClientError, ), pytest.raises(P1MonitorConnectionError), ): assert await client._request("test") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������