pax_global_header00006660000000000000000000000064146030244060014511gustar00rootroot0000000000000052 comment=bc86fece7e75c6622e1748c6d7a174814c32b452 enum_tools-0.12.0/000077500000000000000000000000001460302440600137555ustar00rootroot00000000000000enum_tools-0.12.0/.bumpversion.cfg000066400000000000000000000007771460302440600171000ustar00rootroot00000000000000[bumpversion] current_version = 0.12.0 commit = True tag = True [bumpversion:file:README.rst] [bumpversion:file:doc-source/index.rst] [bumpversion:file:enum_tools/__init__.py] search = : str = "{current_version}" replace = : str = "{new_version}" [bumpversion:file:repo_helper.yml] [bumpversion:file:pyproject.toml] search = version = "{current_version}" replace = version = "{new_version}" [bumpversion:file:.github/workflows/conda_ci.yml] search = ={current_version}=py_1 replace = ={new_version}=py_1 enum_tools-0.12.0/.github/000077500000000000000000000000001460302440600153155ustar00rootroot00000000000000enum_tools-0.12.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001460302440600175005ustar00rootroot00000000000000enum_tools-0.12.0/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000022331460302440600221720ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve labels: bug assignees: domdfcoding --- ## Description ## Steps to Reproduce 1. 2. 3. ## Actual result: ## Expected result: ## Reproduces how often: ## Version * Operating System: * Python: * enum_tools: ## Installation source ## Other Additional Information: enum_tools-0.12.0/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000012161460302440600232250ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project labels: "enhancement" assignees: domdfcoding --- ## Description ## Version * Operating System: * Python: * enum_tools: ## Other Additional Information: enum_tools-0.12.0/.github/auto_assign.yml000066400000000000000000000003471460302440600203600ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- addReviewers: true addAssignees: true reviewers: - domdfcoding numberOfReviewers: 0 # more settings at https://github.com/marketplace/actions/auto-assign-action enum_tools-0.12.0/.github/dependabot.yml000066400000000000000000000003351460302440600201460ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- version: 2 updates: - package-ecosystem: pip directory: / schedule: interval: weekly open-pull-requests-limit: 0 reviewers: - domdfcoding enum_tools-0.12.0/.github/milestones.py000077500000000000000000000012401460302440600200510ustar00rootroot00000000000000#!/usr/bin/env python # stdlib import os import sys # 3rd party from github3 import GitHub from github3.repos import Repository from packaging.version import InvalidVersion, Version latest_tag = os.environ["GITHUB_REF_NAME"] try: current_version = Version(latest_tag) except InvalidVersion: sys.exit() gh: GitHub = GitHub(token=os.environ["GITHUB_TOKEN"]) repo: Repository = gh.repository(*os.environ["GITHUB_REPOSITORY"].split('/', 1)) for milestone in repo.milestones(state="open"): try: milestone_version = Version(milestone.title) except InvalidVersion: continue if milestone_version == current_version: sys.exit(not milestone.update(state="closed")) enum_tools-0.12.0/.github/stale.yml000066400000000000000000000040211460302440600171450ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. # Configuration for probot-stale - https://github.com/probot/stale --- # Number of days of inactivity before an Issue or Pull Request becomes stale daysUntilStale: 180 # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. daysUntilClose: false # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) onlyLabels: [] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - pinned - security - "[Status] Maybe Later" # Set to true to ignore issues in a project (defaults to false) exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: false # Set to true to ignore issues with an assignee (defaults to false) exemptAssignees: false # Label to use when marking as stale staleLabel: stale # Comment to post when marking as stale. Set to `false` to disable markComment: false # This issue has been automatically marked as stale because it has not had # recent activity. It will be closed if no further activity occurs. Thank you # for your contributions. # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Comment to post when closing a stale Issue or Pull Request. # closeComment: > # Your comment here. # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 30 # Limit to only `issues` or `pulls` # only: issues # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': # pulls: # daysUntilStale: 30 # markComment: > # This pull request has been automatically marked as stale because it has not had # recent activity. It will be closed if no further activity occurs. Thank you # for your contributions. # issues: # exemptLabels: # - confirmed enum_tools-0.12.0/.github/workflows/000077500000000000000000000000001460302440600173525ustar00rootroot00000000000000enum_tools-0.12.0/.github/workflows/conda_ci.yml000066400000000000000000000036301460302440600216360ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Conda Tests on: push: branches: ["master"] permissions: contents: read jobs: tests: name: "Conda" runs-on: ubuntu-22.04 defaults: run: shell: bash -l {0} steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Setup Python 🐍 uses: "actions/setup-python@v5" with: python-version: "3.8" - name: Setup Conda uses: conda-incubator/setup-miniconda@v2 with: activate-environment: env conda-build-version: 3.28.4 python-version: "3.8" miniforge-variant: Mambaforge - name: Install dependencies πŸ”§ run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade "whey-conda" "whey" # $CONDA is an environment variable pointing to the root of the miniconda directory $CONDA/bin/conda update -n base conda $CONDA/bin/conda config --add channels conda-forge $CONDA/bin/conda config --add channels domdfcoding - name: "Build and index channel" run: | python -m whey --builder whey_conda --out-dir conda-bld/noarch $CONDA/bin/conda index ./conda-bld || exit 1 - name: "Search for package" run: | $CONDA/bin/conda search -c file://$(pwd)/conda-bld enum_tools $CONDA/bin/conda search -c file://$(pwd)/conda-bld --override-channels enum_tools - name: "Install package" run: | $CONDA/bin/conda install -c file://$(pwd)/conda-bld enum_tools=0.12.0=py_1 -y || exit 1 - name: "Run Tests" run: | rm -rf enum_tools $CONDA/bin/conda install pytest coincidence || exit 1 pip install -r tests/requirements.txt pytest tests/ enum_tools-0.12.0/.github/workflows/docs_test_action.yml000066400000000000000000000015501460302440600234220ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: "Docs Check" on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: contents: read jobs: docs: runs-on: ubuntu-latest steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Check for changed files uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!tests/**' - name: Install and Build πŸ”§ uses: sphinx-toolbox/sphinx-action@sphinx-3.3.1 if: steps.changes.outputs.code == 'true' with: pre-build-command: python -m pip install tox docs-folder: "doc-source/" build-command: "tox -e docs -- -W " enum_tools-0.12.0/.github/workflows/flake8.yml000066400000000000000000000023361460302440600212530ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Flake8 on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: contents: read jobs: Run: name: "Flake8" runs-on: "ubuntu-20.04" steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Check for changed files uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 if: steps.changes.outputs.code == 'true' uses: "actions/setup-python@v5" with: python-version: "3.8" - name: Install dependencies πŸ”§ if: steps.changes.outputs.code == 'true' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install tox~=3.0 - name: "Run Flake8" if: steps.changes.outputs.code == 'true' run: "python -m tox -e lint -s false -- --format github" enum_tools-0.12.0/.github/workflows/mypy.yml000066400000000000000000000024501460302440600210740ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: mypy on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: contents: read jobs: Run: name: "mypy / ${{ matrix.os }}" runs-on: ${{ matrix.os }} strategy: matrix: os: ['ubuntu-20.04', 'windows-2019'] fail-fast: false steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Check for changed files uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 if: steps.changes.outputs.code == 'true' uses: "actions/setup-python@v5" with: python-version: "3.8" - name: Install dependencies πŸ”§ run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 - name: "Run mypy" if: steps.changes.outputs.code == 'true' run: "python -m tox -e mypy -s false" enum_tools-0.12.0/.github/workflows/octocheese.yml000066400000000000000000000006151460302440600222200ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: "GitHub Releases" on: schedule: - cron: 0 12 * * * jobs: Run: runs-on: ubuntu-latest steps: - uses: domdfcoding/octocheese@master with: pypi_name: "enum_tools" env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} if: startsWith(github.ref, 'refs/tags/') != true enum_tools-0.12.0/.github/workflows/python_ci.yml000066400000000000000000000073001460302440600220710ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Windows on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: actions: write issues: write contents: read jobs: tests: name: "windows-2019 / Python ${{ matrix.config.python-version }}" runs-on: "windows-2019" continue-on-error: ${{ matrix.config.experimental }} env: USING_COVERAGE: '3.6,3.7,3.8,3.9,3.10,3.11,3.12,3.13.0-alpha.5,pypy-3.6,pypy-3.7,pypy-3.8,pypy-3.9' strategy: fail-fast: False matrix: config: - {python-version: "3.6", testenvs: "py36-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5},build", experimental: False} - {python-version: "3.7", testenvs: "py37-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3},build", experimental: False} - {python-version: "3.8", testenvs: "py38-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1},build", experimental: False} - {python-version: "3.9", testenvs: "py39-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.10", testenvs: "py310-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.11", testenvs: "py311-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.12", testenvs: "py312-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.13.0-alpha.5", testenvs: "py313-dev-sphinx{6.2,7.0,7.1,7.2},build", experimental: True} - {python-version: "pypy-3.6", testenvs: "pypy36-sphinx{4.3,4.4,4.5}", experimental: False} - {python-version: "pypy-3.7", testenvs: "pypy37-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3},build", experimental: False} - {python-version: "pypy-3.8", testenvs: "pypy38-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1},build", experimental: False} - {python-version: "pypy-3.9", testenvs: "pypy39-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: True} steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Check for changed files if: startsWith(github.ref, 'refs/tags/') != true uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 id: setup-python if: ${{ steps.changes.outputs.code == 'true' || steps.changes.outcome == 'skipped' }} uses: "actions/setup-python@v5" with: python-version: "${{ matrix.config.python-version }}" - name: Install dependencies πŸ”§ if: steps.setup-python.outcome == 'success' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 - name: "Run Tests for Python ${{ matrix.config.python-version }}" if: steps.setup-python.outcome == 'success' run: python -m tox -e "${{ matrix.config.testenvs }}" -s false - name: "Upload Coverage πŸš€" uses: actions/upload-artifact@v4 if: ${{ always() && steps.setup-python.outcome == 'success' }} with: name: "coverage-${{ matrix.config.python-version }}" path: .coverage enum_tools-0.12.0/.github/workflows/python_ci_linux.yml000066400000000000000000000206601460302440600233140ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: Linux on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' tags: - '*' pull_request: permissions: actions: write issues: write contents: read jobs: tests: name: "ubuntu-20.04 / Python ${{ matrix.config.python-version }}" runs-on: "ubuntu-20.04" continue-on-error: ${{ matrix.config.experimental }} env: USING_COVERAGE: '3.6,3.7,3.8,3.9,3.10,3.11,3.12,3.13.0-alpha.5,pypy-3.6,pypy-3.7,pypy-3.8,pypy-3.9' strategy: fail-fast: False matrix: config: - {python-version: "3.6", testenvs: "py36-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5},build", experimental: False} - {python-version: "3.7", testenvs: "py37-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3},build", experimental: False} - {python-version: "3.8", testenvs: "py38-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1},build", experimental: False} - {python-version: "3.9", testenvs: "py39-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.10", testenvs: "py310-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.11", testenvs: "py311-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.12", testenvs: "py312-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.13.0-alpha.5", testenvs: "py313-dev-sphinx{6.2,7.0,7.1,7.2},build", experimental: True} - {python-version: "pypy-3.6", testenvs: "pypy36-sphinx{4.3,4.4,4.5},build", experimental: False} - {python-version: "pypy-3.7", testenvs: "pypy37-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3},build", experimental: False} - {python-version: "pypy-3.8", testenvs: "pypy38-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1},build", experimental: False} - {python-version: "pypy-3.9", testenvs: "pypy39-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: True} steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Check for changed files if: startsWith(github.ref, 'refs/tags/') != true uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 id: setup-python if: ${{ steps.changes.outputs.code == 'true' || steps.changes.outcome == 'skipped' }} uses: "actions/setup-python@v5" with: python-version: "${{ matrix.config.python-version }}" - name: Install dependencies πŸ”§ if: steps.setup-python.outcome == 'success' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 python -m pip install --upgrade coverage_pyver_pragma - name: "Run Tests for Python ${{ matrix.config.python-version }}" if: steps.setup-python.outcome == 'success' run: python -m tox -e "${{ matrix.config.testenvs }}" -s false - name: "Upload Coverage πŸš€" uses: actions/upload-artifact@v4 if: ${{ always() && steps.setup-python.outcome == 'success' }} with: name: "coverage-${{ matrix.config.python-version }}" path: .coverage Coverage: needs: tests runs-on: "ubuntu-20.04" steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Setup Python 🐍 uses: "actions/setup-python@v5" with: python-version: 3.8 - name: Install dependencies πŸ”§ run: | python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade "coveralls>=3.0.0" coverage_pyver_pragma - name: "Download Coverage πŸͺ‚" uses: actions/download-artifact@v4 with: path: coverage - name: Display structure of downloaded files id: show run: ls -R working-directory: coverage continue-on-error: true - name: Combine Coverage πŸ‘· if: ${{ steps.show.outcome != 'failure' }} run: | shopt -s globstar python -m coverage combine coverage/**/.coverage - name: "Upload Combined Coverage Artefact πŸš€" if: ${{ steps.show.outcome != 'failure' }} uses: actions/upload-artifact@v4 with: name: "combined-coverage" path: .coverage - name: "Upload Combined Coverage to Coveralls" if: ${{ steps.show.outcome != 'failure' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | coveralls --service=github Deploy: needs: tests runs-on: "ubuntu-20.04" steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" if: startsWith(github.ref, 'refs/tags/') - name: Setup Python 🐍 uses: "actions/setup-python@v5" if: startsWith(github.ref, 'refs/tags/') with: python-version: 3.8 - name: Install dependencies πŸ”§ if: startsWith(github.ref, 'refs/tags/') run: | python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 - name: Build distributions πŸ“¦ if: startsWith(github.ref, 'refs/tags/') run: | tox -e build - name: Upload distribution to PyPI πŸš€ if: startsWith(github.ref, 'refs/tags/') uses: pypa/gh-action-pypi-publish@v1.4.2 with: user: __token__ password: ${{ secrets.PYPI_TOKEN }} skip_existing: true - name: Close milestone πŸšͺ if: startsWith(github.ref, 'refs/tags/') run: | python -m pip install --upgrade github3.py packaging python .github/milestones.py env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} Conda: needs: deploy runs-on: ubuntu-22.04 if: startsWith(github.ref, 'refs/tags/') || (startsWith(github.event.head_commit.message, 'Bump version') != true) steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Setup Python 🐍 uses: "actions/setup-python@v5" with: python-version: 3.8 - name: Setup Conda uses: conda-incubator/setup-miniconda@v2 with: activate-environment: env conda-build-version: 3.28.4 python-version: "3.8" miniforge-variant: Mambaforge - name: Install dependencies πŸ”§ run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade "mkrecipe" "whey" # $CONDA is an environment variable pointing to the root of the miniconda directory $CONDA/bin/conda config --set always_yes yes --set changeps1 no $CONDA/bin/conda update -n base conda $CONDA/bin/conda info -a $CONDA/bin/conda config --add channels conda-forge $CONDA/bin/conda config --add channels domdfcoding $CONDA/bin/conda config --remove channels defaults - name: Build Conda Package πŸ“¦ run: | python -m mkrecipe --type wheel || exit 1 $CONDA/bin/conda build conda -c conda-forge -c domdfcoding --output-folder conda/dist - name: Deploy Conda Package πŸš€ if: startsWith(github.ref, 'refs/tags/') run: | $CONDA/bin/conda config --set always_yes yes --set changeps1 no $CONDA/bin/conda install anaconda-client $CONDA/bin/conda info -a for f in conda/dist/noarch/enum_tools-*.tar.bz2; do [ -e "$f" ] || continue echo "$f" conda install "$f" || exit 1 echo "Deploying to Anaconda.org..." $CONDA/bin/anaconda -t "$ANACONDA_TOKEN" upload "$f" || exit 1 echo "Successfully deployed to Anaconda.org." done env: ANACONDA_TOKEN: ${{ secrets.ANACONDA_TOKEN }} enum_tools-0.12.0/.github/workflows/python_ci_macos.yml000066400000000000000000000071171460302440600232610ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- name: macOS on: push: branches-ignore: - 'repo-helper-update' - 'pre-commit-ci-update-config' - 'imgbot' pull_request: permissions: actions: write issues: write contents: read jobs: tests: name: "macos-latest / Python ${{ matrix.config.python-version }}" runs-on: "macos-latest" continue-on-error: ${{ matrix.config.experimental }} env: USING_COVERAGE: '3.6,3.7,3.8,3.9,3.10,3.11,3.12,3.13.0-alpha.5,pypy-3.7,pypy-3.8,pypy-3.9' strategy: fail-fast: False matrix: config: - {python-version: "3.6", testenvs: "py36-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5},build", experimental: False} - {python-version: "3.7", testenvs: "py37-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3},build", experimental: False} - {python-version: "3.8", testenvs: "py38-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1},build", experimental: False} - {python-version: "3.9", testenvs: "py39-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.10", testenvs: "py310-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.11", testenvs: "py311-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.12", testenvs: "py312-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: False} - {python-version: "3.13.0-alpha.5", testenvs: "py313-dev-sphinx{6.2,7.0,7.1,7.2},build", experimental: True} - {python-version: "pypy-3.7", testenvs: "pypy37-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3},build", experimental: False} - {python-version: "pypy-3.8", testenvs: "pypy38-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1},build", experimental: False} - {python-version: "pypy-3.9", testenvs: "pypy39-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2},build", experimental: True} steps: - name: Checkout πŸ›ŽοΈ uses: "actions/checkout@v4" - name: Check for changed files if: startsWith(github.ref, 'refs/tags/') != true uses: dorny/paths-filter@v2 id: changes with: list-files: "json" filters: | code: - '!(doc-source/**|CONTRIBUTING.rst|.imgbotconfig|.pre-commit-config.yaml|.pylintrc|.readthedocs.yml)' - name: Setup Python 🐍 id: setup-python if: ${{ steps.changes.outputs.code == 'true' || steps.changes.outcome == 'skipped' }} uses: "actions/setup-python@v5" with: python-version: "${{ matrix.config.python-version }}" - name: Install dependencies πŸ”§ if: steps.setup-python.outcome == 'success' run: | python -VV python -m site python -m pip install --upgrade pip setuptools wheel python -m pip install --upgrade tox~=3.0 virtualenv!=20.16.0 - name: "Run Tests for Python ${{ matrix.config.python-version }}" if: steps.setup-python.outcome == 'success' run: python -m tox -e "${{ matrix.config.testenvs }}" -s false - name: "Upload Coverage πŸš€" uses: actions/upload-artifact@v4 if: ${{ always() && steps.setup-python.outcome == 'success' }} with: name: "coverage-${{ matrix.config.python-version }}" path: .coverage enum_tools-0.12.0/.gitignore000066400000000000000000000020161460302440600157440ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. __pycache__/ *.py[cod] *$py.class *.so .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg *.egg* *.manifest *.spec pip-log.txt pip-delete-this-directory.txt htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ cover/ *.mo *.pot *.log local_settings.py db.sqlite3 instance/ .webassets-cache .scrapy docs/_build/ doc/build target/ .ipynb_checkpoints .python-version celerybeat-schedule celerybeat.pid *.sage.py .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ .spyderproject .spyproject .ropeproject /site .mypy_cache/ .dmypy.json dmypy.json *.iml *.ipr cmake-build-*/ .idea/**/mongoSettings.xml *.iws out/ atlassian-ide-plugin.xml com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties .idea build **/__pycache__ **/conda __pypackages__/ profile_default/ ipython_config.py Pipfile.lock .pyre/ enum_tools-0.12.0/.imgbotconfig000066400000000000000000000001151460302440600164220ustar00rootroot00000000000000{ "schedule": "weekly", "ignoredFiles": [ "**/*.svg" ] } enum_tools-0.12.0/.pre-commit-config.yaml000066400000000000000000000042451460302440600202430ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. --- exclude: ^$ ci: autoupdate_schedule: quarterly repos: - repo: https://github.com/repo-helper/pyproject-parser rev: v0.9.1 hooks: - id: reformat-pyproject - repo: https://github.com/pre-commit/pre-commit-hooks rev: v3.4.0 hooks: - id: check-added-large-files - id: check-ast - id: fix-byte-order-marker - id: check-byte-order-marker - id: check-case-conflict - id: check-executables-have-shebangs - id: check-json - id: check-toml - id: check-yaml - id: check-merge-conflict - id: check-symlinks - id: check-vcs-permalinks - id: detect-private-key - id: trailing-whitespace - id: mixed-line-ending - id: end-of-file-fixer - repo: https://github.com/domdfcoding/pre-commit-hooks rev: v0.4.0 hooks: - id: requirements-txt-sorter args: - --allow-git - id: check-docstring-first exclude: ^(doc-source/conf|__pkginfo__|setup|tests/.*)\.py$ - id: bind-requirements - repo: https://github.com/domdfcoding/flake8-dunder-all rev: v0.3.1 hooks: - id: ensure-dunder-all files: ^enum_tools/.*\.py$ - repo: https://github.com/domdfcoding/flake2lint rev: v0.4.3 hooks: - id: flake2lint - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: - id: python-no-eval - id: rst-backticks - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/asottile/pyupgrade rev: v2.12.0 hooks: - id: pyupgrade args: - --py36-plus - --keep-runtime-typing - repo: https://github.com/Lucas-C/pre-commit-hooks rev: v1.5.1 hooks: - id: remove-crlf - id: forbid-crlf - repo: https://github.com/python-formate/snippet-fmt rev: v0.1.5 hooks: - id: snippet-fmt - repo: https://github.com/python-formate/formate rev: v0.7.0 hooks: - id: formate exclude: ^(doc-source/conf|__pkginfo__|setup)\.(_)?py$ - repo: https://github.com/domdfcoding/dep_checker rev: v0.8.0 hooks: - id: dep_checker args: - enum_tools # Custom hooks can be added below this comment enum_tools-0.12.0/.pylintrc000066400000000000000000000346201460302440600156270ustar00rootroot00000000000000[MASTER] # Specify a configuration file. #rcfile= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns= # Pickle collected data for later comparisons. persistent=yes # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Use multiple processes to speed up Pylint. jobs=1 # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist= # Allow optimization of some AST trees. This will activate a peephole AST # optimizer, which will apply various small optimizations. For instance, it can # be used to obtain the result of joining multiple strings with the addition # operator. Joining a lot of strings can lead to a maximum recursion error in # Pylint and this flag can prevent that. It has one side effect, the resulting # AST will be different than the one from reality. This option is deprecated # and it will be removed in Pylint 2.0. optimize-ast=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. #enable= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=all enable=assert-on-tuple,astroid-error,bad-except-order,bad-inline-option,bad-option-value,bad-reversed-sequence,bare-except,binary-op-exception,boolean-datetime,catching-non-exception,cell-var-from-loop,confusing-with-statement,consider-merging-isinstance,consider-using-enumerate,consider-using-ternary,continue-in-finally,deprecated-pragma,django-not-available,duplicate-except,duplicate-key,eval-used,exec-used,expression-not-assigned,fatal,file-ignored,fixme,global-at-module-level,global-statement,global-variable-not-assigned,global-variable-undefined,http-response-with-content-type-json,http-response-with-json-dumps,invalid-all-object,invalid-characters-in-docstring,len-as-condition,literal-comparison,locally-disabled,locally-enabled,lost-exception,lowercase-l-suffix,misplaced-bare-raise,missing-kwoa,mixed-line-endings,model-has-unicode,model-missing-unicode,model-no-explicit-unicode,model-unicode-not-callable,multiple-imports,new-db-field-with-default,non-ascii-bytes-literals,nonexistent-operator,not-in-loop,notimplemented-raised,overlapping-except,parse-error,pointless-statement,pointless-string-statement,raising-bad-type,raising-non-exception,raw-checker-failed,redefine-in-handler,redefined-argument-from-local,redefined-builtin,redundant-content-type-for-json-response,reimported,relative-import,return-outside-function,simplifiable-if-statement,singleton-comparison,syntax-error,trailing-comma-tuple,trailing-newlines,unbalanced-tuple-unpacking,undefined-all-variable,undefined-loop-variable,unexpected-line-ending-format,unidiomatic-typecheck,unnecessary-lambda,unnecessary-pass,unnecessary-semicolon,unneeded-not,unpacking-non-sequence,unreachable,unrecognized-inline-option,used-before-assignment,useless-else-on-loop,using-constant-test,wildcard-import,yield-outside-function,useless-return [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html. You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". This option is deprecated # and it will be removed in Pylint 2.0. files-output=no # Tells whether to display a full report or only the messages reports=no # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= [BASIC] # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Include a hint for the correct naming format with invalid-name include-naming-hint=no # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty # Regular expression matching correct function names function-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for function names function-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct variable names variable-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for variable names variable-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Naming hint for constant names const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression matching correct attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for attribute names attr-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for argument names argument-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Naming hint for class attribute names class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Naming hint for inline iteration names inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ # Regular expression matching correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Naming hint for class names class-name-hint=[A-Z_][a-zA-Z0-9]+$ # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Naming hint for module names module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression matching correct method names method-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for method names method-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 [ELIF] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [FORMAT] # Maximum number of characters on a single line. max-line-length=159 # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma,dict-separator # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [TYPECHECK] # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=no # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=(_+[a-zA-Z0-9]*?$)|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,future.builtins [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make [DESIGN] # Maximum number of arguments for function / method max-args=5 # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=_.* # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branches=12 # Maximum number of statements in function / method body max-statements=60 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of boolean expressions in a if statement max-bool-expr=5 [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=Exception enum_tools-0.12.0/.readthedocs.yml000066400000000000000000000012071460302440600170430ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. # Read the Docs configuration file --- version: 2 sphinx: builder: html configuration: doc-source/conf.py formats: - pdf - htmlzip python: install: - requirements: requirements.txt - requirements: doc-source/requirements.txt build: os: ubuntu-20.04 tools: python: '3.9' jobs: post_create_environment: - pip install .[all] post_install: - pip install sphinxcontrib-applehelp==1.0.4 sphinxcontrib-devhelp==1.0.2 sphinxcontrib-htmlhelp==2.0.1 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==1.0.3 sphinxcontrib-serializinghtml==1.1.5 enum_tools-0.12.0/.style.yapf000066400000000000000000000272001460302440600160550ustar00rootroot00000000000000[style] # Align closing bracket with visual indentation. align_closing_bracket_with_visual_indent=True # Allow dictionary keys to exist on multiple lines. For example: # # x = { # ('this is the first element of a tuple', # 'this is the second element of a tuple'): # value, # } allow_multiline_dictionary_keys=True # Allow lambdas to be formatted on more than one line. allow_multiline_lambdas=False # Allow splitting before a default / named assignment in an argument list. allow_split_before_default_or_named_assigns=True # Allow splits before the dictionary value. allow_split_before_dict_value=True # Let spacing indicate operator precedence. For example: # # a = 1 * 2 + 3 / 4 # b = 1 / 2 - 3 * 4 # c = (1 + 2) * (3 - 4) # d = (1 - 2) / (3 + 4) # e = 1 * 2 - 3 # f = 1 + 2 + 3 + 4 # # will be formatted as follows to indicate precedence: # # a = 1*2 + 3/4 # b = 1/2 - 3*4 # c = (1+2) * (3-4) # d = (1-2) / (3+4) # e = 1*2 - 3 # f = 1 + 2 + 3 + 4 # arithmetic_precedence_indication=False # Number of blank lines surrounding top-level function and class # definitions. blank_lines_around_top_level_definition=2 # Insert a blank line before a class-level docstring. blank_line_before_class_docstring=False # Insert a blank line before a module docstring. blank_line_before_module_docstring=False # Insert a blank line before a 'def' or 'class' immediately nested # within another 'def' or 'class'. For example: # # class Foo: # # <------ this blank line # def method(): # ... blank_line_before_nested_class_or_def=True # Do not split consecutive brackets. Only relevant when # dedent_closing_brackets is set. For example: # # call_func_that_takes_a_dict( # { # 'key1': 'value1', # 'key2': 'value2', # } # ) # # would reformat to: # # call_func_that_takes_a_dict({ # 'key1': 'value1', # 'key2': 'value2', # }) coalesce_brackets=True # The column limit. column_limit=115 # The style for continuation alignment. Possible values are: # # - SPACE: Use spaces for continuation alignment. This is default behavior. # - FIXED: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns # (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or # CONTINUATION_INDENT_WIDTH spaces) for continuation alignment. # - VALIGN-RIGHT: Vertically align continuation lines to multiple of # INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if # cannot vertically align continuation lines with indent characters. continuation_align_style=VALIGN-RIGHT # Indent width used for line continuations. continuation_indent_width=8 # Put closing brackets on a separate line, dedented, if the bracketed # expression can't fit in a single line. Applies to all kinds of brackets, # including function definitions and calls. For example: # # config = { # 'key1': 'value1', # 'key2': 'value2', # } # <--- this bracket is dedented and on a separate line # # time_series = self.remote_client.query_entity_counters( # entity='dev3246.region1', # key='dns.query_latency_tcp', # transform=Transformation.AVERAGE(window=timedelta(seconds=60)), # start_ts=now()-timedelta(days=3), # end_ts=now(), # ) # <--- this bracket is dedented and on a separate line dedent_closing_brackets=False # Disable the heuristic which places each list element on a separate line # if the list is comma-terminated. disable_ending_comma_heuristic=False # Place each dictionary entry onto its own line. each_dict_entry_on_separate_line=False # Require multiline dictionary even if it would normally fit on one line. # For example: # # config = { # 'key1': 'value1' # } force_multiline_dict=False # The regex for an i18n comment. The presence of this comment stops # reformatting of that line, because the comments are required to be # next to the string they translate. ;i18n_comment= # The i18n function call names. The presence of this function stops # reformattting on that line, because the string it has cannot be moved # away from the i18n comment. ;i18n_function_call= # Indent blank lines. indent_blank_lines=False # Put closing brackets on a separate line, indented, if the bracketed # expression can't fit in a single line. Applies to all kinds of brackets, # including function definitions and calls. For example: # # config = { # 'key1': 'value1', # 'key2': 'value2', # } # <--- this bracket is indented and on a separate line # # time_series = self.remote_client.query_entity_counters( # entity='dev3246.region1', # key='dns.query_latency_tcp', # transform=Transformation.AVERAGE(window=timedelta(seconds=60)), # start_ts=now()-timedelta(days=3), # end_ts=now(), # ) # <--- this bracket is indented and on a separate line indent_closing_brackets=True # Indent the dictionary value if it cannot fit on the same line as the # dictionary key. For example: # # config = { # 'key1': # 'value1', # 'key2': value1 + # value2, # } indent_dictionary_value=True # The number of columns to use for indentation. indent_width=4 # Join short lines into one line. E.g., single line 'if' statements. join_multiple_lines=False # Do not include spaces around selected binary operators. For example: # # 1 + 2 * 3 - 4 / 5 # # will be formatted as follows when configured with "*,/": # # 1 + 2*3 - 4/5 ;no_spaces_around_selected_binary_operators= # Use spaces around default or named assigns. spaces_around_default_or_named_assign=False # Adds a space after the opening '{' and before the ending '}' dict delimiters. # # {1: 2} # # will be formatted as: # # { 1: 2 } spaces_around_dict_delimiters=False # Adds a space after the opening '[' and before the ending ']' list delimiters. # # [1, 2] # # will be formatted as: # # [ 1, 2 ] spaces_around_list_delimiters=False # Use spaces around the power operator. spaces_around_power_operator=False # Use spaces around the subscript / slice operator. For example: # # my_list[1 : 10 : 2] spaces_around_subscript_colon=False # Adds a space after the opening '(' and before the ending ')' tuple delimiters. # # (1, 2, 3) # # will be formatted as: # # ( 1, 2, 3 ) spaces_around_tuple_delimiters=False # The number of spaces required before a trailing comment. # This can be a single value (representing the number of spaces # before each trailing comment) or list of values (representing # alignment column values; trailing comments within a block will # be aligned to the first column value that is greater than the maximum # line length within the block). For example: # # With spaces_before_comment=5: # # 1 + 1 # Adding values # # will be formatted as: # # 1 + 1 # Adding values <-- 5 spaces between the end of the statement and comment # # With spaces_before_comment=15, 20: # # 1 + 1 # Adding values # two + two # More adding # # longer_statement # This is a longer statement # short # This is a shorter statement # # a_very_long_statement_that_extends_beyond_the_final_column # Comment # short # This is a shorter statement # # will be formatted as: # # 1 + 1 # Adding values <-- end of line comments in block aligned to col 15 # two + two # More adding # # longer_statement # This is a longer statement <-- end of line comments in block aligned to col 20 # short # This is a shorter statement # # a_very_long_statement_that_extends_beyond_the_final_column # Comment <-- the end of line comments are aligned based on the line length # short # This is a shorter statement # spaces_before_comment=2 # Insert a space between the ending comma and closing bracket of a list, # etc. space_between_ending_comma_and_closing_bracket=True # Use spaces inside brackets, braces, and parentheses. For example: # # method_call( 1 ) # my_dict[ 3 ][ 1 ][ get_index( *args, **kwargs ) ] # my_set = { 1, 2, 3 } space_inside_brackets=False # Split before arguments split_all_comma_separated_values=False # Split before arguments, but do not split all subexpressions recursively # (unless needed). split_all_top_level_comma_separated_values=True # Split before arguments if the argument list is terminated by a # comma. split_arguments_when_comma_terminated=False # Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@' # rather than after. split_before_arithmetic_operator=True # Set to True to prefer splitting before '&', '|' or '^' rather than # after. split_before_bitwise_operator=True # Split before the closing bracket if a list or dict literal doesn't fit on # a single line. split_before_closing_bracket=True # Split before a dictionary or set generator (comp_for). For example, note # the split before the 'for': # # foo = { # variable: 'Hello world, have a nice day!' # for variable in bar if variable != 42 # } split_before_dict_set_generator=True # Split before the '.' if we need to split a longer expression: # # foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d)) # # would reformat to something like: # # foo = ('This is a really long string: {}, {}, {}, {}' # .format(a, b, c, d)) split_before_dot=False # Split after the opening paren which surrounds an expression if it doesn't # fit on a single line. split_before_expression_after_opening_paren=True # If an argument / parameter list is going to be split, then split before # the first argument. split_before_first_argument=False # Set to True to prefer splitting before 'and' or 'or' rather than # after. split_before_logical_operator=True # Split named assignments onto individual lines. split_before_named_assigns=True # Set to True to split list comprehensions and generators that have # non-trivial expressions and multiple clauses before each of these # clauses. For example: # # result = [ # a_long_var + 100 for a_long_var in xrange(1000) # if a_long_var % 10] # # would reformat to something like: # # result = [ # a_long_var + 100 # for a_long_var in xrange(1000) # if a_long_var % 10] split_complex_comprehension=True # The penalty for splitting right after the opening bracket. split_penalty_after_opening_bracket=100 # The penalty for splitting the line after a unary operator. split_penalty_after_unary_operator=10000 # The penalty of splitting the line around the '+', '-', '*', '/', '//', # ``%``, and '@' operators. split_penalty_arithmetic_operator=300 # The penalty for splitting right before an if expression. split_penalty_before_if_expr=0 # The penalty of splitting the line around the '&', '|', and '^' # operators. split_penalty_bitwise_operator=300 # The penalty for splitting a list comprehension or generator # expression. split_penalty_comprehension=80 # The penalty for characters over the column limit. split_penalty_excess_character=7000 # The penalty incurred by adding a line split to the unwrapped line. The # more line splits added the higher the penalty. split_penalty_for_added_line_split=30 # The penalty of splitting a list of "import as" names. For example: # # from a_very_long_or_indented_module_name_yada_yad import (long_argument_1, # long_argument_2, # long_argument_3) # # would reformat to something like: # # from a_very_long_or_indented_module_name_yada_yad import ( # long_argument_1, long_argument_2, long_argument_3) split_penalty_import_names=0 # The penalty of splitting the line around the 'and' and 'or' # operators. split_penalty_logical_operator=300 # Use the Tab character for indentation. use_tabs=True enum_tools-0.12.0/CONTRIBUTING.rst000066400000000000000000000025031460302440600164160ustar00rootroot00000000000000============== Contributing ============== .. This file based on https://github.com/PyGithub/PyGithub/blob/master/CONTRIBUTING.md ``enum_tools`` uses `tox `_ to automate testing and packaging, and `pre-commit `_ to maintain code quality. Install ``pre-commit`` with ``pip`` and install the git hook: .. code-block:: bash $ python -m pip install pre-commit $ pre-commit install Coding style -------------- `formate `_ is used for code formatting. It can be run manually via ``pre-commit``: .. code-block:: bash $ pre-commit run formate -a Or, to run the complete autoformatting suite: .. code-block:: bash $ pre-commit run -a Automated tests ------------------- Tests are run with ``tox`` and ``pytest``. To run tests for a specific Python version, such as Python 3.6: .. code-block:: bash $ tox -e py36 To run tests for all Python versions, simply run: .. code-block:: bash $ tox Type Annotations ------------------- Type annotations are checked using ``mypy``. Run ``mypy`` using ``tox``: .. code-block:: bash $ tox -e mypy Build documentation locally ------------------------------ The documentation is powered by Sphinx. A local copy of the documentation can be built with ``tox``: .. code-block:: bash $ tox -e docs enum_tools-0.12.0/LICENSE000066400000000000000000000167441460302440600147760ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. enum_tools-0.12.0/README.rst000066400000000000000000000131711460302440600154470ustar00rootroot00000000000000============ Enum Tools ============ .. start short_desc **Tools to expand Python's enum module.** .. end short_desc .. start shields .. list-table:: :stub-columns: 1 :widths: 10 90 * - Docs - |docs| |docs_check| * - Tests - |actions_linux| |actions_windows| |actions_macos| |coveralls| * - PyPI - |pypi-version| |supported-versions| |supported-implementations| |wheel| * - Anaconda - |conda-version| |conda-platform| * - Activity - |commits-latest| |commits-since| |maintained| |pypi-downloads| * - QA - |codefactor| |actions_flake8| |actions_mypy| * - Other - |license| |language| |requires| .. |docs| image:: https://img.shields.io/readthedocs/enum-tools/latest?logo=read-the-docs :target: https://enum-tools.readthedocs.io/en/latest :alt: Documentation Build Status .. |docs_check| image:: https://github.com/domdfcoding/enum_tools/workflows/Docs%20Check/badge.svg :target: https://github.com/domdfcoding/enum_tools/actions?query=workflow%3A%22Docs+Check%22 :alt: Docs Check Status .. |actions_linux| image:: https://github.com/domdfcoding/enum_tools/workflows/Linux/badge.svg :target: https://github.com/domdfcoding/enum_tools/actions?query=workflow%3A%22Linux%22 :alt: Linux Test Status .. |actions_windows| image:: https://github.com/domdfcoding/enum_tools/workflows/Windows/badge.svg :target: https://github.com/domdfcoding/enum_tools/actions?query=workflow%3A%22Windows%22 :alt: Windows Test Status .. |actions_macos| image:: https://github.com/domdfcoding/enum_tools/workflows/macOS/badge.svg :target: https://github.com/domdfcoding/enum_tools/actions?query=workflow%3A%22macOS%22 :alt: macOS Test Status .. |actions_flake8| image:: https://github.com/domdfcoding/enum_tools/workflows/Flake8/badge.svg :target: https://github.com/domdfcoding/enum_tools/actions?query=workflow%3A%22Flake8%22 :alt: Flake8 Status .. |actions_mypy| image:: https://github.com/domdfcoding/enum_tools/workflows/mypy/badge.svg :target: https://github.com/domdfcoding/enum_tools/actions?query=workflow%3A%22mypy%22 :alt: mypy status .. |requires| image:: https://dependency-dash.repo-helper.uk/github/domdfcoding/enum_tools/badge.svg :target: https://dependency-dash.repo-helper.uk/github/domdfcoding/enum_tools/ :alt: Requirements Status .. |coveralls| image:: https://img.shields.io/coveralls/github/domdfcoding/enum_tools/master?logo=coveralls :target: https://coveralls.io/github/domdfcoding/enum_tools?branch=master :alt: Coverage .. |codefactor| image:: https://img.shields.io/codefactor/grade/github/domdfcoding/enum_tools?logo=codefactor :target: https://www.codefactor.io/repository/github/domdfcoding/enum_tools :alt: CodeFactor Grade .. |pypi-version| image:: https://img.shields.io/pypi/v/enum_tools :target: https://pypi.org/project/enum_tools/ :alt: PyPI - Package Version .. |supported-versions| image:: https://img.shields.io/pypi/pyversions/enum_tools?logo=python&logoColor=white :target: https://pypi.org/project/enum_tools/ :alt: PyPI - Supported Python Versions .. |supported-implementations| image:: https://img.shields.io/pypi/implementation/enum_tools :target: https://pypi.org/project/enum_tools/ :alt: PyPI - Supported Implementations .. |wheel| image:: https://img.shields.io/pypi/wheel/enum_tools :target: https://pypi.org/project/enum_tools/ :alt: PyPI - Wheel .. |conda-version| image:: https://img.shields.io/conda/v/conda-forge/enum_tools?logo=anaconda :target: https://anaconda.org/conda-forge/enum_tools :alt: Conda - Package Version .. |conda-platform| image:: https://img.shields.io/conda/pn/conda-forge/enum_tools?label=conda%7Cplatform :target: https://anaconda.org/conda-forge/enum_tools :alt: Conda - Platform .. |license| image:: https://img.shields.io/github/license/domdfcoding/enum_tools :target: https://github.com/domdfcoding/enum_tools/blob/master/LICENSE :alt: License .. |language| image:: https://img.shields.io/github/languages/top/domdfcoding/enum_tools :alt: GitHub top language .. |commits-since| image:: https://img.shields.io/github/commits-since/domdfcoding/enum_tools/v0.12.0 :target: https://github.com/domdfcoding/enum_tools/pulse :alt: GitHub commits since tagged version .. |commits-latest| image:: https://img.shields.io/github/last-commit/domdfcoding/enum_tools :target: https://github.com/domdfcoding/enum_tools/commit/master :alt: GitHub last commit .. |maintained| image:: https://img.shields.io/maintenance/yes/2024 :alt: Maintenance .. |pypi-downloads| image:: https://img.shields.io/pypi/dm/enum_tools :target: https://pypi.org/project/enum_tools/ :alt: PyPI - Downloads .. end shields This library provides the following: #. ``enum_tools.autoenum`` – A `Sphinx `_ extension to document Enums better than ``autoclass`` can currently. #. ``@enum_tools.documentation.document_enum`` – A decorator to add docstrings to ``Enum`` members from a comment at the end of the line. #. ``enum_tools.custom_enums`` – Additional ``Enum`` classes with different functionality. Installation -------------- .. start installation ``enum_tools`` can be installed from PyPI or Anaconda. To install with ``pip``: .. code-block:: bash $ python -m pip install enum_tools To install with ``conda``: .. code-block:: bash $ conda install -c conda-forge enum_tools .. end installation Further Reading ----------------------- #. https://docs.python.org/3/library/enum.html #. `Is it possible to define a class constant inside an Enum? `_ #. `Enums with Attributes `_ #. `When should I subclass EnumMeta instead of Enum? `_ enum_tools-0.12.0/__pkginfo__.py000066400000000000000000000004441460302440600165620ustar00rootroot00000000000000# This file is managed by 'repo_helper'. Don't edit it directly. __all__ = ["extras_require"] extras_require = { "sphinx": ["sphinx>=3.4.0", "sphinx-jinja2-compat>=0.1.1", "sphinx-toolbox>=2.16.0"], "all": ["sphinx>=3.4.0", "sphinx-jinja2-compat>=0.1.1", "sphinx-toolbox>=2.16.0"] } enum_tools-0.12.0/artwork/000077500000000000000000000000001460302440600154465ustar00rootroot00000000000000enum_tools-0.12.0/artwork/enum_tools.xcf000066400000000000000000000433521460302440600203430ustar00rootroot00000000000000gimp xcf v011Σt–BBσ gimp-commentCreated with GIMPgimp-image-grid¬(style solid) (fgcolor (color-rgba 0 0 0 1)) (bgcolor (color-rgba 1 1 1 1)) (xspacing 10) (yspacing 10) (spacing-unit inches) (xoffset 0) (yoffset 0) (offset-unit inches) r5'ΗhLogo!?€ "     %$#oΗh›55Ηhλ MΑ%„%Λ)0v4Ξώψτ=ψτUψωϊ:ψϊΓnoo€ω9ψϊόhŠω2ψόϊϋϋωψϊωϊ½ŠωψόϊϋϋωψόϊϋϋωψόωϋϋϊψωωΡ[‘νψ⼊ωψψωΡXŠοψψφ!νψψδ|@ΏψψΫ²rϊψἊωψψθ('Έ‹–ωψΎ„Ύ£~ϊψb°½oΟψχϊ‹²ψϊ„{λψἊωψψκΔΣϋΰqχωžλϊΟέωψέςλΠμψψϋkΝψψϊϊψἊωψψφ³sockφψΩ1p­ςψψ™TƒΞϊψχϋkΜψψϊϊωψἊωψψ½`Β±kφψψγ§q/lϊψχΙ‹cΐψχϊ†―ψϊznαψ༊ωψψ›΅ωΙiυωίΛφϊλIλσΡήϊφƊωψΥΦ°‘mϋξΊΌg½Ός«c°O+3Γϋƒΐ²Iωι6ΉΎ‹ωψχωΝU“μψΪκφq1Σ’=ϋο“υ|δψψΥa'υψωϊϋϋωψψωϋψςωϋϊψωϋϊψψωϊϋϋωψόϊϋϋϊ{ψωεπψψφηρ8ψω)ΔψψοNΗ8ψρ:ΖψψοWΘψψρΑ²έω0ψρ:ΖψψοWΘψφzΐ¨DΩ0ψπ:·ζζέTΘψλ‘δψϋt₯ω/ψπ?3&&*?ΘψψχΡΖΘmœω/ψπ:ΗϊϊρXΘψμgo€­cœω/ψπ:ΖψψοWΘψ»Lσωό|œω/ψπ:ΖψψοWΘψ΄XϋωβQœϊ/ψπ:ΖψψοWΘψΰD—¦‰¦aΎ/ψπΕεψψτΙεψωδΗΝυτΘΤpψϊωρηζκω9ψωΝaCLC˜φ7ψπχA­ϊϊάFΓψλ―ιΏΓυ/ψπςΫψψωαξψβD{°»W’0ψπ‰kΙθχωψψβC³ωψΛ@π/ψπςΐ{9tΊχψβDΧψψλ δ1ψςωτΔQ±ωβDάψψρ ή.ψώκΧψτϊ€χβDΦψψηθώψτ=ψτUψωϊω:ψ̝Ρ:ψϋΨ·€Θ3ψύωϊϊψωύΕΘψύωϊϊψϊψόωϊϊωψϊΦ–{‡ΑτψύΔΘψθΧ”zƒΌφψψυΎ‰yˆΑυψψε€|œάωψψΪ’Ν­~»ωψύΔΘψηη‚‘Υ¨ΙψωΒ}ΊΥΈ{ΓψχˆΟš€θψχω£}Ωψυ¬―ωψύΔΘψηκΤβϊά~­ωϊͺ}Ψςωήνψτz”μχνγτψψυ’}λψψωωψύΔΘψθυΕ’•€¬ωψΩ}ާΟχψψ«ƒ˜΅εψψτ‘}λψψϊϊψύΔΘψηΔ¦ΥΑ¬ωψψζΏ ˆ·ωψφΤ°—€βψχω’}Ψψχ  χψύΔΘψη£€ΪψΛ¬ωψθΰωων†ˆϋσίλωφΛΔψΦΦ‘Ν­~·ωνΣΤ€°ΤΨχ΄€©Η…•ΰψŸΕΧΖ~§ωζ}™ΣΥ¨ΩψΧωΥ”{‡ΑτψΨxyz{zyŒσλ|˜η΄|­ωﱃy…ΆπψψΩ™|{•Πψύωϊϊψωϊψφωϊωψωϊωψψωϊψόωϊϊωzψψφετψψυζς7ψψλέψψγ:Σ7ψπλήψψδFΤψψμ»΄εω/ψπλήψψδFΤψξeŽΐžMε/ψπλΞζζΣEΤψζœξψφ`Ύ/ψπλ/.&&,@ΤψψτΝΖΙ\΅/ψπλΰϊϊζFΤψδSz¦­U΅/ψπλήψψδFΤψͺkψωϊe΅/ψολήψψδFΤψ¦€ϋωΣG²ω.ψολήψψδFΤψΡ?‘ ›‹nΞ.ψοσΓνψψπΗκψωέΖΠχοΖήpψϊωξζζλω9ψωΎWGII¨ϊ7ψπμ)ΕϋϊΞ:ΥψζοΉΚφ/ψοΫ&μψψφαρψΪ<‰΅΅I·ω.ψϋφm|Οιψψέ;Ηψω·iτ/ψποΊm>{Εϊψέ<ζψψΥ4π1ψςϊπΊGΔψέ=οψψΫ'π.ψοεΩωψψϋ‚–ωέ<εψψΠ<πώψτ=ψτUψϊω:ψ’oΡ:ψϋ΅UΘ3ψύϊϋϊψϋωϊ™ΘψύϊϋϊψόωϋϋϊψόϊϋϋϊψωχΈ0°φψύ˜Θψθχ΅+ ­χψψν‹ ―φψψΠVgΨψψω²f³o΄ψύ˜ΘψηΚYΑdΗψϊ€€½½ψλNΊ·A%μψχτWΫψαzϊψύ˜ΘψηΫΕέϋ²šωϋ^ΡοςΝθψΥpθφΰΥσψψζκψψϊϊψύ˜Θψθο™poN—ωω¬HzΒχψυWc•αψψζ ιψψϊϊψύ˜Θψ爈Ō—ωψωΣ•h ―ωψπ»}PδψχσSΩψεltϊψα˜ΘψψωΦωš–ωυΥΤϊψΫMϋμΛκϊρœΔψΥω¬a΄oωίΌΌo–ΌΘω]Œ‘0fΫπJ-°ΐ—˜ωΘtΌΊgΪψχφ΅)°φψΉσdφΪChΰo‘ωάwυŸπψψΊ7WΘωψύϊϋϊψωϋοϊψψϊϋϊψϊϋωψψωϋϋϊωψόϊϋϋϊzψψσεφψψτευ7ψψΥξψψέ,δ7ψρΦ,ξψψή<δψωζ·­Ήλ0ψπΦ,ξψψή<δψηS›ΐ_π/ψπΦ.άζζΞ<δψٞψψκO/ψπΦ9)&&-AδψωπΛΖΐOΠ/ψπΦ+πϊϊΰ;δψΧE†§¦KΠ/ψπΦ,ξψψή<δψωωξTΠ/ψπΦ,ξψψή<δψ†¦ϊωΔ?Ν/ψοΦ,ξψψή<δψΐF§—«q~Ω.ψοκΔτψψνΖπψωΦΖΦϊθΖδpψϊωμζζξω9ψω«MJDTΌω7ψρΨ4Φϊϊ½3δψΪ΅μ΅―Τ0ψπΘKρψψσβσψΔOˆΉ­BΙ/ψϊξTŽΤλωψψΔ=Χψϊ›‡χ/ψφκ²aH„ΤωψΔDψύΔ^σ1ψςϊκ­@ΩψΔKόψψΗRς-ψύωίίψϊϊk«ωΔBψύΑgτό jΛχ9ύ<ώ =i>Λ>χΏ›ψωϊψώϊω(ψΗoώ‘ϊ ψύξ~Ϋ ψώΧ¨©ΪψϊŒk†ϊ ψύω‘˜ψώχ°ΣψΈωΎψψωϋϋϊψόϊϋϋωψϊωϊΏ†ϊψόϊϋϋϊψύΦJδψύφJ²βΦψψϋψυξο‘©ξξυψΰvZΝωψψΗM…δψόΎ†ϊψωΩeWΜωψύ—ŽϊψύφIΒψχπάψψϊ—³ψοο6―&ΧψΛI±“TυψνΎ†ϊψψυ/-ΈΉ\αψψτKΘψύφIΒψχρ-zψψϊ—³ψοΊyϋψ©˜ψ„ΏψωLΟψνΎ†ϊψψπFδυγΣρψψι ηψύφJŠΰ«τψρ)Νψψϊ—³ψψϊ˜³ψψΖ†φAΤψϋxΉψνΎ†ϊψψφs]ŒΩωψψΩυψύφJ΄ΰ±υψρβψψϊ—³ψψϊ•³ψψΕ†φAΤψϋyΉψόΎ†ϊψττΐƒZΨψψΦ$υψύφIΒψχρβψψϊ—³ψο»{ϋψ§œψ†ΏψωJΤψνΎ†ϊψψοΞδϊτ°ͺψψΰ πψύφIΒψχρβψψϊ—³ψΩο8 ίψΛI±fφνΌΌc½½ξΧ`»½sΛψψς-ΥψύφI΅ηυιψρβψψϊ”±ψοΰvfΤωψψΗJιψΩρέψΖIBΎχψψχ­ωψύυ>,(ϋaϋρβψύϊϋωψόωϋϋϊψωϊϋϋωψψωϋωωψψϊϋϋϊψύΎZτψϊψϋ.ψύσ]Ώ=ψύΦGη=ψώηοŒψώξα=ψώαΌ=ψάε½λ±ΰ―ΰΪΫωΟΐΈςΎ΄ρψψσΙ²έωψψμ¬φΪ°ά ψϊ ψάθΎγI‘—sšYω±\­h…ͺ[΅ψυ‚zΑ³GΙψψτΕGŸ₯Σψώφ‘ώˆο ψήλΐγGΣηΰίFμ²rυ©fύ£œωΜNοψωΉoυψυRWγω ψώχΪΥώΤυ ψίυλγHβξπαIθ²”ω―Šϋšω©^ΘΖΖ²)ςψφb¨ω ψλγIεξπβIθ²—ω―ϋšω€V˜–ϊ“ρψφbΔ ψνλχ ψλγIεξπβIθ²—ω―ϋšω―eύϊψύφaΔ ψώφ†bώYν ψβγIεξπβIθ²—ω―ϋšωΩDΩϊϊΝ΄χψφaΔ ψϊ ψβεIεξπβIθ²—ω―ϋšωψ©N“ŒEΛψψφaΔ!ψθπΗπτΓυοΗρήΦψέΤωέΧψψωΰΗΙλψύχΛδδψιΰ΄­Ύπψψχ­θΟ―Έοψψη±ς½ΕυψϋζΆ­ΎοψωΏχΗ―°ξψωϊψΦΫ?¬Ώ}υψφEŠ™ΌqtωψΩE‹³΄EΆψψήH§ΓŒjςψψΘ\΄\ͺ λψߍώ§ϊψΦωΝ°χψδλψφK—ϊψΦDεψΩ>Κψω¦†χϋ|€ψψχn»ψψΨA‡φψω ψοΥώέωψδωκΚΖΑγψφGΘψψίFίψΩEιψψΎzφςP’Ζω‚ŒϊψΪBΥψγωΗ@©§#γψφFΚψψΰFίψΩFνψψΎzφνM–ϊ­ϊψΪIε ψτλξψδc¨ϊωκγψφFΚψψΰFίψΩFνψψΎzφχUΓϊϊωψψΪIζ ψΩbώϊψ›ψωϊωψώϊω'ψώωΈoΓψύγxη ψΜ©βψϋƌfΆ ψύφvψώξ―άψŸωΠψψϊϋϋϊψόϊϋϋωψϋωϊΈΆψόϊϋϋωψύΓUπψύζD²α±ήψωϊψςξρd²ξξφψΦdkΨωψφΉ5’μψύ·ΆψσΞRmΨωψψφ~«ωψύζCΩψχΩ2ΦψψϋiΊψοα ͺͺ(δψΉ\³ˆxφψύ·ΆψσμL»΄B0λψψξ"άψύζCΩψγέ;ˆψψϋiΊψψω ‘ωψ±χUΠψρ5θψύ·ΆψσΦqθχέΦτψψΡ.υψύζEšΰ―χψέ!ΰψψϋiΊψψϋgΌψψ©“φβψόMΛψύ·ΆψωσSe˜βψύΔPφψύζDž΄ΰΆχψέφψψϋiΊψψϋgΌψψ¨”φβψόMΜψύ·ΆψτπΊ}PζψψΒUφψύζCΩψγέφψψϋiΊψψω ‘ωψΆχWΠψο2ιψύ·ΆψσμΚλϊρ–ΗψψΛAυψύζCΩψχέφψψϋiΊψΩα ­§9ιψΉ\΄ƒˆχκΌΌˆ‰ΌΎφΘt½»cάψψγλψύζCΛηυμψέφψψϋbΈψοΨ`vίψψφΉ.›ρψΤςοχΈ4WΙωψψυ[Γψύζ8*(ϋ‡ϊάφψύϊϋωψόϊϋϋωψωϊϋϊωψψωϋψόϊϋϋϊψύ«vωψϊύψωϋ.ψύκLΞ<ψόωΑ_ο<ψύχερŒψώΧΖ<ψύω£E=ψά―QθΆΧ°θΠ―εωΔΨΉΐς·ΉυψψπΑ΅δωψψΰΆχΡ―­ζ ψϊ ψά½ZάR—Œt—Šzύf³LŠ΄NΛψοm‰Β©LΧψψγ+ΔL₯ŸβψώυώŽφ ψίΛcά?αΟ3ξΤKύ“ψ™Œύ~°ψΉdχψϊ‘Œχψτ/gξ ψώχΧΥώΦχ ψΰμΨάBσΨKςΫGϋ“£ω’―ϋ©ψ™~ΗΖΖ‘Sτψυ8Ύ!ψλάBχΨRσΫGϋ“¦ω’΅ϊ©ψi—–ϊšυψυ.Ω ψμλ ψλάBχΨRσΫGϋ“¦ω’΅ϊ©ψž‹όϊψύυ-Ϊ ψώτjbώfφ ψβάBχΨRσΫGϋ“¦ω’΅ϊ©ωΗJηϊωΎΓψψυ-Ϊ ψϊ ψβέBχΨRσΫGϋ“¦ω’΅ϊ©ψυ“\–„IΪψψυ-Ϊ!ψθνΖψλΘφμΗωΥΪψΩίωΤΫψψωΩΖΚρψύχΔμγψθωΧ²Γσψψτ©ρΗ½ςψψΪ·οΈ―Νχψϋή΄ΔσψωΛΞυΐ²φψωϊωψΦΙD³Ύj˜χψσŽ₯Ί_’ϊψΔW…·ͺ?ΙψψΝE±Β|‚χψψ±vŸj«œφψώΊωψΦω½ΌψψΠ>ρψφ%°ωψΔIφψΔ@Ωψϋƒψχ`»ψψςJΟψψΗE™ωψω ψκΥγψΪωεΘΖ°3ρψφήψψΩEπψΔOωψω‘™ψγGΖΖΕp°ωψΝDβψγω²G•ͺ˜5ρψφδψψΩEπψΔSόψω’™ψήD‡–ϊΒωψΝPυ ψσλπψγξSΐϊωΥ1ρψφδψψΩEπψΔSόψω’™ψθJΦϊϊωψψΝPφ ψΙbώͺωψ°ψϊ)ψόώϊψύΨ€ο ψϊόωψϋϋόώϊ ψύρYΑψώζ―ώ­ζψόωψύόϊ ψύ³kφψύΨC‘²ϋ°ηψωϊψύώωψϊϊώύωψϋϋώώόψύόϊψϊϊώύωψύτZΒψύΨEΰψύΓqΚψύώωψπωώϋϋώψψϋύϊύόψύόϊψωωύϊϋώψύά!οψύΨEΰψύΗN˜ψύώωψπύϊψψύϊψώωψωώψύόϊψωϊόωψωωψύΐ`φψύΨCžϊ»χψΗ2ρψύώωψυώωψψόϋψώψώώψύόϊψϋώώόψύ΅~χψύΨC£΄ϊΐχψΗRχψύώωψυώωψψόϋψώψψύόϊψϋϋύώώψύ²χψύΨEΰψύΗTχψύώωψπύϊψψύϊψώωψωώψύόϊψϊψψύωψψΌpφψύΨEΰψύΗTχψύώωψίωώϋόώψψϋύϊύόψωϊϊύόϊϊψϋόϊϊώψύΝ=υψύΨEΡηϋξψΗTχψύώωψϋϊώόψψϋώώϋψψϋχώψψϋώύωψύο0ΧψύΧ2*(ϋ«ωΕJχ-ψύ•”ϊψωϊόωψωϊ.ψύέHή<ψόϊͺyτ<ψύυδτŒψώΤΘ<ψύω‘[<ψνω˜hέΕΝ²ξΗ±μϊΈΫ΄Ιο±Βψϋμ»ΊκψωΨΓχΚ―«ς ψϊ ψΫω’zΗdœx{€|όpp΄C†²Fάψζ]•ΕœYεψψΝa°X©˜ρψώπˆώŸχ ψέ―ŽΙCρΐYσ½kώp£ψtόcΙψ¦…ϊψϊƒ£ψψΰ:xσψω ψώφΤΥΪ ψκηαΙXόΖyφΖdώpΊψΐϋkΒχv–Ζω–|φψη Σ!ψμΙ[ϋΖ|φΖdώpΎψ€ΑϋkΒχew–ϊ§φψηο ψώχκλν ψμΙ[ϋΖ|φΖdώpΎψ€ΑϋkΒχ―ϊϊωψψησ ψώοYbώ‚χ ψβΙ[ϋΖ|φΖdώpΎψ€ΑϋkΒψ΅Zπϊψ°Ξψψησ ψϊ ψβΙ[ϋΖ|φΖdώpΎψ€ΑϋkΒψρ}g—}Xεψψησ!ψθζΙωεΠχεΛϋΝβψΠγωΜγψψωΖΞυψύρΒφγψθχ°―Λυψψη°οΐΔυψψΠΕθ΄°ΦωψρΧ²ΛυψψχΑΩοΉ·ϊψωϊωψΥω³VΈ»U―ψψάE}°·J±ωψ­sΊŸ@ΪψωΉQ·ΐjšχψψŸž‚{ͺ’ϋψΑΟψΦϊ°ΖψψΎkτψέ+Ιψψ°aϋψHκψϊf―ψνNΜψψθ(γψψ―Jωψω ψζΥώΤιψΪϊήΘΖ ]σψέ!πψψΐVόψjϋψϋy¦ψΩC·ΖΖΔTΒψψ΅Nρψδ›Tšͺ‹^σψέ'ρψψΐWόψrϋψϋy¦ψΧ@Ž–ϊψψ΅fϋ ψρλςψγβEΟϊωΓ]σψέ'ρψψΐWόψrϋψϋy¦ψάEβϊϊωψψ΅hϋ ψ΄bΕψ™ψώϊω<ψύφŽΔ=ψύΩ>η#ψύωϊϊψώωϊψφϊωψωϊωϊψϊϊψύ“Žϊψύωϊωψκvά;ψύυz¦<ψύτετρψύωϊϊ:ψϊωδ¦~Ÿέ/ψόσαΒρψϊέ|yάψωψϊαΒξθΓθ"ψόρΐοψϋωάyuΆ ψϊΕθΤΦ"ψόϊΛχψϊρΩ}uu© ψϊΟυέί"ψρϋΦχψψσˆsus{Žΐχψϊάψζΰ"ψρϋβ"χψψχΈs}βΐސΒψϊθψπ#γ"ψύωτΣψχχΆ£φχΏΔψϊτψψΠτ*ψχψϋχΎΖ;ψϋχ»ŽΗ;ψϋχΊΙ;ψϋχΈŽΚ;ψϋφΈΨ;ψόχΈ”Υ<ψώφο}ψύσΨξ<ψόο‘™Τ0ψωφΔΩχΝΜωψόꚘλ ψϋΞΜϊΥΕ ψπϋ-§χzvϋψϊΏξψυ›™ΤψωωtϋŸHωψοό;±ωŠŠϊψϊ₯§Ω΄™™Ξωψωω†„ϊ°fωψυϋL½ωŽωψψΦ—™ώ›έψϊω–ϊ΅ ψωϋ`Κω”―ωψχΤ’˜˜™™›άωψϊω–¨ωΉ” ψϊωΩνψΰζψψωϊ՚™™›έψϋαζψιΰ.ψψ՘™™›ΡΧν7ψύω՚™Υ8ψΥ™˜ν!ψ˜ψώωϊ=ψύζ|έ<ψόω±sφ#ψϊωψώϊωψφϊωψϊωϊϊψϊϊψύρ`ΐψϊψκ]3ƒοψχ±ωψχ/Ρω’§\gΦR[λψόω―lχψόω‰Uρψκιγf©ωχ†³ωψχ?ω˜bηfrηuΏψύΪBγψόω‹[ρψκωŸ€ϋχ†³ωψχ?ω˜‘ό‘¨ω“―ωψύτ;Πψύδίχψκω£|ϋχ†³ωψχ?ω˜₯ϋ–ω”«ωψύϋMΑ#ψκω£|ϋχ†³ωψφ?ω˜§ϋ–ω”«ωψύϋQΎ#ψκω£|ϋψ‰­ωψε=ω˜§ϋ–ω”«ωψύϊAΘψύεΰχψκω£|ϋωŸpθι @ω˜§ϋ–ω”«ωψύζ;έψόω‹Zρψκω wϋψζt8]ΤDΞω”€ϋ’«ω‘©ωψύΕZοψόω‰Uρψϊψϊτψϊωψϊϊψϊωψϊωψόχ„ϊψϊ4ψύΦ;κ;ψύο^½<ψύρζφρψύωϊϊ:ψϊω欈¦ί/ψόϊάΒχψϊί…ƒήψωψϊήΒψδΓξ"ψόϋΆ χψϋωΩ~Ί ψϊ΅ψΜα"ψόϋΉ?χψωρΫ†›ωψϊ»/ψΞ,δ"ψρϋΏ^χψψσ}}k”φψϊΔOψΣ=κ"ψπϊΙuχψψχΌ}†δ•—ωψϊΟhψΫIπ#ψώνΪψφχΊ¨χχ‘šχψϊπΪψςχ*ψχψϊφžω:ψϊφ‰ χ:ψϊυˆ£ω:ψϊφ…₯χ:ψϋυƒΐ;ψόυ„ Ό<ψύτηχ|ψύτάο<ψόπ­¦Ω0ψωξΔίυΕΥωψό짦νψϊυΗΣϊΙΝ ψπη"½ςOžωψωΖοψφ¨¦Ψψϊς[–όn ψοο!Κτd²ωψϊ°±ά½¦¦Σωψϊυl©ϋ†˜ ψϊω%ΦχwΎψώΪ₯¦ώ§αψϋ}Ίωœ¦ ψϊό2άω…ΑψχΨ₯₯¦¦¨ΰωψϊω„Αψ­© ψϊωΣρψΫλψψωϊΪ§¦¦§αψϋάκψδδ.ψψΪ₯¦¦¨ΥΫξ7ψύωΪ§¦Ω8ψΪ¦ύ₯¦ξ!ψψτψτ²ψψτψτ²ψψτψτ²ψωχΛj ύώ iΛχ–.ψοΖBΫϊϊσ}”ψβC­ωϊ½Xς.ψπφ™D€‡g]γψβD„Š—I»0ψρϊήΘΖΡχψψβDέΤΖΩω8ψύβDέ<ψύβDέ<ψύλ―ι΅ψϊωρηζκω9ψωΝaCLC˜φ7ψπχA­ϊϊάFΓψψχ°°φ/ψπςΫψψωαξψψœbΈ΅Q§0ψπ‰kΙθχωψψΫAαψψΤ}ς/ψρςΐ{9tΊχψΊRϋψψωϊ2ψχωτΔQ±ω±\ϋ3ψώκΧψτϊ€χΐJϊψψφκχ.ψοΖBΫϊϊσ}”ψγFΠϊϊΐEρ.ψπφ™D€‡g]γψωΈHŠDΖ0ψϊϊήΘΖΡχψόεΗΘκΒψτ?ψτ=ψ-ψξω­\ζϊϊξd¨ωέ;Αϊϊ¨yφ.ψπσƒN……]pμψέ<Œ’’AΜ1ψόΩΗΗΥψωέ=νΠΖαω8ψύέ=ο<ψύέ=ο<ψύισ΅ψϊωξζζλω9ψωΎWGII¨ϊ7ψρμ)ΕϋϊΞ:ΥψψτΜ―±Ω0ψοΫ&μψψφαρψτ†uΊ°GΌω.ψϋφm|ΟιψψΛFξψωÏτ/ψροΊm>{Εϊψ©wϋψψωϊ2ψχϊπΊGΔψ₯ˆϊ3ψοεΩωψψϋ‚–ω¬mϋψψτλχ-ψξω­\ζϊϊξd¨ωΥAαϊωͺiτ.ψπσƒN……]pμψχ₯U’„GΧ1ψόΩΗΗΥψϋωήΗΙοΒψτ?ψτ=ψ-ψοϊ’sνϊϊεT½ψΔ=ϊω‹”/ψπλqZ†ƒR†σψΔM‰—‰Cά0ψςχΣΗΗΫωψψΔOψΜΗθ9ψύΔNϋ<ψύΔNϋ<ψύά±ϊ΅ψϊωμζζξω9ψω«MJDTΌω7ψπΨ4Φϊϊ½3δψψρΕ―³ήω/ψπΘKρψψσβσψοrƒΌ§EΛ/ψϊξTŽΤλωψψΉ]φψϊ― χ/ψρκ²aH„Τωψ’‘ωψψωϊ2ψψϊκ­@Ωψ3ψύωίίψυϊk«ωš–ωψψσμ.ψξϊ’sνϊϊεT½ψΓKνϊω‘‡χ.ψπλqZ†ƒR†σψτŽ`“}Uβ0ψϊχΣΗΗΫωψϋωΨΗΜσΒψτ?ψτ=ψ€χ>Λ>i>ώ =ύ<ό jΛχ9Ωφ]Έωω¬0αψφFΚψψΰFίψΩFνψψΎzφϊ”‚υϊυ©άψψΪIζ ψωϊψΩω¦Y«‹½ZγφFΚψψΰFίψΩFνψψΎzφψμit—spοψψΪIζψΰωΡΗίωβΗκχΗζψψξΗξψμΗσψψβΟχψψυΞΖΡχψύμΗρψύχΕγ<ψύχOΖ=ψώντ:ψϋσ«ΫψϊχΣ°ΗσψϋςΒ±ΧψϋεΆ­½ξψςΏχΗ―°ξψψο½­³έ ψχωϊϊψτ»ΌVΒψΧΎbΎΒ…‹ϊψψŒΓΎVΓψψΩFͺÌaξψψΘ\΄\ͺ λψσlšΕΉKΡψόωΐψύχeΒψΧ‰»ωψξΛφψηMήψψβΪψϊwžψψχfΆψψΨA‡φψωψψΪNμψωΩΰ ψύδΥΥψύχeΒψό°W°ΨψυυmvΐδωψψοNΛψω „ϊψΪBΥψϊοRΕκωψύχeΒψνχĈUJΗωψψξ―zAqΰψκKΥψω€sϋψΪIεψϊκ¨u8‚θ ψύπλλψύχeΒψοϊξΒEγψψωωψκ—|φςQΕψω›ϊψΪIζψωόχζ†˜ψΥω²bbψϊϊωfΓϊϊψχžηϊϊθNήψδžχωϊΓsφϊŒχϊνOΘψψΪIζψωΪ§ωωϊ²’ ψωϊΪ ‘‘Mv‘“νψ­^™šh˜ψψρtwž’PΙψψι`›eυψψΪIζψωλa€žŽKΨ ψώωΜΖψρψϊάΘΗΫωψϋΡΖΙιωψϋσΝΖΦωψύμΗρψϋυΞΖΚοNψΩκNΝωψ–5ρψφδψψΩEπψΔSόψω’™ψωv™χϊρžζψψΝPφ ψωϊωψΩωŒj―‚Ζ4œθφδψψΩEπψΔSόψω’™ψψβU~˜g‡τψψΝPφψθχΜΗδψάΗοχΓπψψμΗυψδΘϊψωΩΧψϋρΜΖΥωψύηΘχψύςΓλ<ψύλ@Ϊ<ψύχμυ:ψϋζ¬­ζψϊυΛ―Νφψϋο½­²ήψϋή³ΓρψρΛΞυΐ²φψψκΉ­Άδω ψϊϊψλΌΌ3ΧψΧ©yΒΐt€ωψςkšΕΈNΣψωΘD²Β}yυψψ±vŸj«œφψιZ€Ε―Mαψόϊ¬ψύχ0ΧψΦχ]ΞωψιΞωψάHξψωΧίψφZ΅ψψοCΚψψΗE™ωψωψψΠZϊψϊΟεψόωήΥΥψύχ0Χψϋ–eΈάϊψλξUΕιωψψαFΩψψχ†©ωψΝDβψϊδEŽΛξωψύχ0ΧψντΌ€M\Σωψψθ¦t:„θψάDέψω“ωψΝPυψϊα n4•ο ψύξλλψύχ0Χψωζμ³Lρψψωωχ憙ψδGΧψψχ~±ωψΝPφψϋωυβn­ψΥϊ–bbψϊϊω0ΩϊϊψςοωϊΪHξψΪ§ωωϊ²‘ψωo’ωϊγ/ΩψψΝPφψωΞ·ϊωϊš§ ψϊίσ™‘‘=€‘•ωψ–j›˜\ϊψλ^€žŽKΨψψέO‡™Y¦ψύΝPφψωβNˆž‡Rδ ψώυΙΖχΗωψωΧΗΗαωψϋυΝΖΚοψϋοΚΗάϊψύηΘχψϋρΛΖΜσNψΩίBΪωυ|Xτψέ'ρψψΐWόψrϋψϋy¦ψτ_ωϊμ™οψψ΅hϋ ψωϊωψΩυsy|Β.¦ρέ'ρψψΐWόψrϋψϋy¦ψψΦE†”[χψψ΅hϋψθςΙΘκψΥΘτνΔυψψγΙϊψέΝωψωΟΪψϋνΚΗΫϊψύίΜωψύθΔτ<ψύΤBξ<ψύυμχ:ψϋέ­¬ςψϋσΔ±ΤψωωιΈ­΅εωψκΦ±―ΙτψψχΑΩοΉ·ϊψωβ΄­Ήλ ψϊϊψδΌ³νψΦχ‡ΓΌg½ωψιY¦Ε―Pΰψω³RΈΐj‘χψψŸž‚{ͺ’ϋψΰN°Δ£]κψόϋ™ψύκνψΦφ"δψψβΥωψΠSϋψϊΟεψλLΘψψε"ήψψ―JωψωψψΉqόψϊΚμψόωΨΥΥψύκνψϊχzp½βϊψλεGŽΚξωψψΧFεψψφ^Αψψ΅NρψϊΧC›Ξςωψύκνψϊο΄|Cmήψμα m4”οψHλψψφo½ψψ΅fϋψωωΩ—g3£τ ψύμλλψύκνψωόκ’bϊψνωτβn«ψΪEβψψυTΔψψ΅hϋψϋϊσάUΏψΥϋxbbψϊϊλοϊωψζ£τωϊΟTϊψΟΉϊωϊ•₯ψςXΈωϊΣ1ιψψ΅hϋψωΓΗϊωϊtΉ ψϊίκ”‘Š7‹‘‘ϊυ}vœ”RΔωψαMŠ ‡SδψωΠE•MΊψύ΅hϋψωΤGžgμ ψώοΗΖψΛωψχΗΘηψϋπΛΖΜσψϋκΙΗβωψύίΜωψϋλΚΖΠφNψ ψψϋ‹ˆ‘ςθ’Ρ7ψψϊ“ˆΡψψκξ8ψόΠ†˜ν<ψύΠ”³=ψώϊω?ψρψύςπχ3ψδύγεχψϋηβεγχ(ψϊφΰοχαλψςργψψζμψψξγψψεοψϋΰλψεζ ψϊσΉγωΊΪψιπεψψμΰχψγκψψηξψψϊΌΪψΘΜωψϊτ»ηϊ½ίψιχΰξυγέμπέατοΰχψψωΐήωΜωψϊω ψϊυ½μωΒγψττεαγΛ§ΣΦγαδσψϊωΔβωΟΦψώŒΡ ψϊφΐπωΖζψϋω΅±ΜΥψϊωΙζωΣΪψΥώΤκ ψϋμχψντψόλ¬­ιψϋξτψπς.ψόαΙ²ΒψλσψϊςΜΦ³—θψbώaΘψϊΪΝπψϊωψψξΛβψψԘέ7ψύΤΦχψύ·¦χ5ψύοΝρψύοžα6ψνψώεχψψψϋ›™­σκ‘Φ7ψψϊ’™Φψψμπ8ψόΥ—¦ξ<ψύΥ’½=ψω>ψύχΟΡψύΥΞτ2ψςφ}{tυψψφk‚oτ(ψϊιΒηνΓΰψιΣqωχ‰ΈωψΒvφω‡ΙψψοΓίτΗΤωψϊΨΦδΒψιΟ|ϊψΉ[συr«ωω“Δψψθ ΏρUœωψϊζβμΞψιςOΏαs(ΔΡcίΘGξψψυΛτe­ωψϊω ψϊξνχΪψτα†_u_³Ϋtb€ΫψϊϋΥψw½ψώŒα ψϊξχό$ήψφϊσωΆΎΦΤχτϊψϊϋ(ΰϊΓψΥώΤο ψϊφψωΣρψόν»»μψϊωΤςψΫλ.ψόζΤΏΛψλτψϊσΦήΏ©λψbώ`ΫψϊαΧςο―ΎψϊωψψπΥηψψΩ©α7ψώάήψύΒ΄χ5ψύρΧςψύπε6ψοψώθχψψψϊ¨¦·σμ­Ϊ7ψψϊ¦Ϊψψνπ8ψόΩ₯±ο<ψύΩΔ=ψω>ψύχΤψύΨΡτ2ψςφ†„}Šυψψχ–vŠzτ(ψϊαΒπθΓιψκΥ{ωχΌωψΖφωŽΜψψθΓθςΓή ψϊΑπΫψκΡ…ϊψ½hσφ|°ωωšΗψψΤΨλΏ ψϊΜχΩήψκς_Γδ|AΗΣVm‹“–˜™-šτ#>^~˜¬ΉΏΓΕ.Ζρ 3V~’½ΟΩίαβ0γρ$Cm™½Υδμπςς0σρ ,Q¬Οδπυψωω0ϊρ 2Z‹ΉΩμυϊϋόό0ύς 6`“ΐίπψϋύύ1ώσ 8c—Γαςωόύ2ώτ 9e˜Εβςϊόώ/τ 9e™Εγσϊύώ0ς 9f™Εγσϊύώώ1ς 9f™Ζγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1??? ??9?e?š?Ζ?γ?σ?ϊ?ύ€ώ €??? ??9?e?š?Ζ?γ?σ?ϊ?ύ€ώ €ΐΐΐό  ω φ 9υ852,$ feρc`ZQC3# š™ο˜–“‹mV>' ΖΖΕςΓΏΉ¬˜~^>#γρβαίΩΟ½’~V3 σςσπμδΥ½™mC$ϊωσψυπδΟ¬Q, ύόσϋϊυμΩΉ‹Z2 ώύτϋψπίΐ“`6 ώσύόωςαΓ—c8 ώτόϊςβŘe9 ώτύϊσγΕ™f9 ώτύϊσγΕ™f9 ώτύϊσγΖ™f9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9    ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9fšΖγσϊύώώ1ς 9f™Ζγσϊύώώ1ς 9f™Εγσϊύώώ1τ 9e™Εγσϊύώ0τ 9e˜Εβςϊόώ/σ 8c—Γαςωόύ2ώς 6`“ΐίπψϋύύ1ώρ 2Z‹ΉΩμυϊϋόό0ύρ ,Q¬Οδπυψωω0ϊρ$Cm™½Υδμπςς0σρ 3V~’½ΟΩίαβ0γτ#>^~˜¬ΉΏΓΕ.Ζρ '>Vm‹“–˜™-šο #3CQZ`ceef.eυ $,25819φ 0ψ 2 ώ/2    €€ώ?ύ?ϊ?σ?γ?Ζ?š?e?9?? ??    €€ώ?ύ?ϊ?σ?γ?Ζ?š?e?9?? ??άάάώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγƚf9 ώτύϊσγΖ™f9 ώτύϊσγΕ™f9 ώτύϊσγΕ™f9 ώτόϊςβŘe9 ώσύόωςαΓ—c8 ώύτϋψπίΐ“`6 ύόσϋϊυμΩΉ‹Z2 ϊωσψυπδΟ¬Q, σςσπμδΥ½™mC$γοβαίΩΟ½’~V3 ΖΖΕρΓΏΉ¬˜~^>#š™ή˜–“‹mV>' eefeec`ZQC3# 9υ852,$ φ  ψ ϊi:4enum_tools-0.12.0/artwork/enum_tools_original.xcf000066400000000000000000001177271460302440600222370ustar00rootroot00000000000000gimp xcf v011ς–BBσ gimp-commentCreated with GIMPgimp-image-grid¬(style solid) (fgcolor (color-rgba 0 0 0 1)) (bgcolor (color-rgba 1 1 1 1)) (xspacing 10) (yspacing 10) (spacing-unit inches) (xoffset 0) (yoffset 0) (offset-unit inches) jςLogo!?€ "     %$#oς£Ÿ³ŸΏŸΛςσ₯€ώΪ'›1£4ψ55P7ώEM“PEVλXΰXπY[fέpΊr xl~•~₯~΅€Άˆγ’E–˜GŸ#Ÿ3ŸCŸSŸcŸsŸƒŸ“Ÿ£ Έψƒ7ψƒ7ψƒ7ψΙ‹ύM<ψύ›<ψύ›<ψύ›$ψφπ›E>“θ ψύ›#ψώͺώ’ ψύ›"ψ“ ‹ ψύ›!ψΑό&dl6Ί ψύ›!ψ.]ψƒ6 ψύ› ψΑώπψ&Ρ ψύ› ψl]ψ’]Α ψύ› ψ6›ψύ› ψΊψύ› ψΑψύ› ψΑψύ› ψ²ψύ› ψ6“ψύ› ψdUψ“‹ ψύ› ψ²ώθψ6Ί ψύ› ψώπώMπψ‹& ψύ›!ψͺόlt6²ψΩ‹ύM"ψt ƒψͺ#ψώ›ώ’ψͺ Έψ–€7ψ–€7ψ–€7ψΞΓύ€€<ψύž€€<ψύž€€<ψύž€€$ψχ鸚‡€ƒ©Φψύž€€"ψώτ΄€ώ–ε ψύž€€!ψώτ‘ €ώ‡α ψύž€€!ψ΄€ό‘΄°‹€ώτ ψύž€€ ψε€ψώτš€Γ ψύž€€ ψ°€©ψα€– ψύž€€ ψ€Ϊψ΄­ώ°τ ψύž€€ψμ€πψύž€€ψέ€‡ψύž€€ψΦ€ψύž€€ψΦ€ψύž€€ψΪ€‡ψύž€€ψι€μψύž€€ ψ‹€Φψž‡ώ‹ε ψύž€€ ψ­€₯ψώ郀‹ ψύž€€ ψέ€Ξψώτž€Έ ψύž€€!ψ©€όžΈ°‹€ώ‹πψΦΓύ€€!ψώτš €ώ‡έψ₯€"ψώτ­€ώ–εψ₯€ ·ψΡ6ψΡ6ψΡ6ψώθ“‹ƒ;ψθ;ψθ;ψθ$ψχΊ]&.lΡ ψθ"ψώΩ6ώdπ ψθ!ψώΡ ώ>π ψθ ψώπ&ϋUtMl ψθ ψƒώΰψώΙώΩ ψθ ψ²ψtƒ ψθψΑώπψΡ]“ ψθψ“Eψθψl]ψθψUlψθψUdψθψd]ψθψ‹>ψθψΊώπψώΩ> ψθψώπ’ψ‹d ψθ ψlώΩψώΙΙ ψθ ψώθϋ]tUUψ‹t!ψώΑ ώ6πψώπ"ψώΡ.ώdπψώπ €ψl<ψl<ψl<ψl<ψl<ψl<ψl<ψl ψχΙd.Mͺ ψφͺU&E‹θ ψόΩƒ>l ψώπUώ6ΰψώΑώ“ψll ψ> ώ&πψώΙ ƒψUl ψ“ϋƒͺƒ‹ψ6ϊEƒ›“]Ιψ²ϊd“l ψ&’ψ².ψΩƒψώΡdψ]ωθψψlψώΰώπψώπώπψΊ²ψϋ‹]ƒ›Αψ>6ψlψ&ΩψΑώEθψ>ωͺψψlψ.ΩψώθόM“Ι ψlϋ&ll ψϋπ›MΩψdόE“ΰψώΩl ψώΙ ΩψώπE ώ]θψώ²lψώΰ.Ωψώ’& ώΰψύΩ]lψdώ&Ρψ.Ω ψόΩ›UMψωπΊt6lψ²ψΩ ψύΰ’>ώθ ψlψώπΩψΰΩψdΙ ψlψθΡψtΡψϋΊ‹d>›ψͺΑψϊΩ’tM>πψlψƒψ›²ψ.ώΰψUώθψͺƒψ>‹ͺψMϊMd.Uύ6²Ίψ›ωd“››t.Uψώπύ>ƒ›>ψΊύ.π6ψE ώΰψώΑ >ψ‹ό.ΰψƒ6ψώπd ώEΰψώΑ €ψ€α<ψ€α<ψ€α<ψ€α<ψ€α<ψ€α<ψ€α<ψ€α ψχΞ₯ƒ€ƒ’°α ψφπΓ‘ƒ€ƒ’© ψόΪ°–‡€α ψώα’€΄ ψώΓƒ€ώ’αψώιš€α ψώε‡ €΄ψΏ €ώƒαψώμ‹€α ψž€ό–ΗΞ­€ώƒεψώ郀ϊ‡­ΓΛΓ‘€’ψ­€ϊšΈΗ€€αψε€ώ‡πψ©€ΏψΓ€αψΓ€Ϊψώτ‡€₯ψ€αψώΏ‹­ψΦ€‘ψ°€‡ψϊτ©°ΓΞμψμ€Γψ€αψε€šψ°€Γψπ€ω’ιψψ€€αψε€–ψΞ€ό°Ξι ψ€ϋ‘Γ€€α ψό쿞‡€–ψώτ€ό­τψΗ€α ψώΗƒ €–ψώα‹ €ώ‡Ηψ°€αψΞ€ό––’€–ψύ𴇠€­ψώ֚€αψώτ€ώ­τψε€– ψό῞ƒ€ΞψωπΞ­€€αψέ€ώ‡τψα€–ψύεÏ€‘ ψ€αψΞ€šψΗ€–ψώπ€ ψ€αψΞ€–ψώτ’€–ψϊ𿩚μψ©€ψϋέΗ°žΈψ€αψΪ€ϋεψψτ₯€ώ‹τψ倩ψώπ‹€‘ψ©€ώƒαψ€°Γϋεψψπƒ€ω‡­­‹€ƒ₯€ύ°Φεψ‘€ω–ΈΛΛΗ°‡€ψέ€όƒ­ΗΛ€Λψ°€ώΏΪ€Γψώι‹ €©ψ΄€Λψώτž€ό°ψψ–€Γψώιš €ώƒΈψώΓƒ€ €ψώ=ψώ=ψώ=ψώ=ψώ=ψώ=ψώ=ψώ ψφΰ‹>6‹θ ψφΙl66lΙ ψψπ›M ψώ“ώ²ψώθM ώMθψώͺ ψ“ ώΑψώπ. ώ6πψͺ ψώΩόU’›..ψ‹ϊ&l““ttψώπϊM‹› ψƒMψώθΡψ6ώ.πψώπ6ώπψ²ͺψώ ψUώͺψ]’ψ]ψϊΑUl“ͺπψ“Ωψώψƒ‹ψώΙψ›ϊdπψψψƒ‹ψEό6t²π ψΙϋU› ψόΑ].‹ψΊύ.tΑψ> ψώπM ‹ψ‹ ώ.Αψώΰ& ψMϋ&..‹ψώΙM ͺψύπ‹ψΑώ’ψƒ‹ ψόπ²d.ώθψϊΡ‹EψlUψl‹ ψόπΊd› ψώψM‹ψ>‹ψΊl ψώψEƒψΙƒψϋΡ›lEUψώπlψϊπ²‹]6Ίψώψ].ψώΡ]ψƒͺψͺ›ψώπώ6πψώ‹όπψψ’ω.dE.&ψ›²πψψΰϊM‹››‹Mώθψlόl“›ϋΰψψπύΙdΩψ› ͺψώθ.ΰψώΙϋ²ψΡΩψώ’ ώ²ψώθM aψͺΩ*ψͺΩ*ψͺΩ*ψͺΩ ψϋ.dΊψπΩͺώΡΩψόΩt6ώ6Ω ψΑ ψώπd ώΰψΑ ψώπ>ύ›ƒ.MψΑ ψ]6ψ]ώΰψΑ ψΙ’ψϊΩUl‹ͺθψΑ ψ]U)ψΑ ψϋΊψψͺθ%ψΑψΰψθψψ&dΊ"ψΑψΑψώͺ ψΑψΊψ‹ψΑψ²ψΙψΑψΑψύΑtlψΑψΰθψώΩEψΑ ψΊψ.EψΑ ψd]ψώΡlψΑ ψΙϊͺψ›‹UΙψΑ ψdEƒψΑ ψώπ> ώ› ψΑ ψώπd aψM6+ψM6+ψM6+ψM6 ψϋƒ‹žΏιψΰΩ]EΩΰψόΊ]&€΄!ψlU ψώΡ6€© ψlU ψώΙύΗ΄‹€ΞψlU ψώθϊMψψπ€šψlU ψtώΩψϋΞ­ΈΗΪψlUψώπ²)ψlUψΑϊπψψέτ%ψlUψ“>ψϋ€ƒžΏε"ψlUψl]ψ€ώ‘ι ψlUψ]dψ€ώ‡αψlUψ]dψ€’ψlUψl]ψύπΦ₯€έψlUψ“>ψΗ€ΞψlUψΑώπψε€ΛψlUψώπ²ψΏ€έψlU ψtϊΰψΛΏž€–ψlU ψώθώ]€ώ‡αψlU ψώΙ€ώ–α ψlU ψώΩ6 aψώϋ+ψώϋ+ψώϋ+ψώϋ ψϋM›π!ψώωώϊ ψόϊύώώώͺ!ψώω ψώϊώͺ ψώω ψϋώ‹Uώθψώω ψωϋώόψψ²“ψώω ψύόψϋldƒ’Ρψώωψωώ*ψώωψϋόψΡ&ψώωψύϊψϋM›θ"ψώωψώωψύtπ ψώωψώωψώ>πψώωψώωψtψώωψώωψύΩ“.ψώωψύϊψ>θψώωψϋόψƒθψώωψωώψώπ6ψώω ψύϊόψψ“lƒψώω ψωώύϋώ6πψώω ψϋώ]π ψώω ψώϊώ ₯ψ>²4ψ>²4ψ>²4ψͺ‹.²9ψU²9ψU²9ψU²ψό6ƒΩ ψφΑd.E“π ψU² ψύΑd.lψώΰ>ώ’ ψU² ψώΰ> ώEπψώΩ ƒ ψU² ψώθ&l.tψώπ&ϋMtd² ψU² ψl.ψ‹ώΰψ“ώΡψώπM. ψU² ψ>ψ.‹ψ&›ψώΰΙ ψU²ψώπlψ‹EψΡώθψE‹ ψU²ψώπώΡψΊψͺ.ψtU ψU² ψ6ψΡϋπψψ‹Eψ“> ψU² ψ’ψΩόθψψtUψ’. ψU² ψtψΩόθψψtUψ’. ψU² ψόΑ>ψΡϋπψψ‹Eψ“> ψU² ψώθͺψ²&ψͺ.ψt] ψU²ψƒUψΩώθψ>“ ψU²ψ&’ψ&›ψώΩΩ ψU²ψϋΙ›lEdψlώπψ“ώΡψώθ>M ψU²ψdϋΑψtl&’ψώπ.ϋUt]ώΡψΊ‹.]‹ΑψώΡώUlψώΩ ώͺψdƒψ‹ ώ›ψώΰ>ώΑψdƒψώ› €ψΰ4ψΰ4ψΰ4ψώπ“‹:ψ:ψ:ψψϊM›π ψφπ’M&]²ψ ψόπ’U&ώͺψώ²ώ.Ρ ψ ψώΊ “ψ› ώΑ ψ ψώΊύt]ώΑψώΙϋ]tMώθ ψ ψ&ϋMψψπ>>ψ6ώEπψώΩƒ ψ ψΙ“ψΡΩψΙώΰψ› ψ ψͺΙψ.›ψƒMψώθΩ ψ ψͺώUπψ]lψMƒψ&² ψ ψΩψƒMψ.’ψ>“ ψ ψMψ‹Eψ&ͺψE‹ ψ ψώθ6ψ‹Eψ&ͺψE‹ ψ ψό“ψtUψ.’ψ>› ψψώΩ“ψ]tψMƒψ² ψψ.ͺψ‹Mψώΰΰ ψψΙώθψΙώΰψ“6 ψ ψϋ²‹]6ͺψώθ.]ψ>ώEπψώΙ’ ψ ψϊ&θψt]ώΰψώΙόdtM>ψ›‹ƒ‹θψƒώlώΊψ› ώΰψΡψώπ6 ώ.Ιψώ²ώMθψΡψώπU €ψϊό4ψϊό4ψϊό4ψωϋόό9ψϊό9ψϊό9ψϊόψϋώύόω ψχϋύώώύϋω ψϊό ψύϋύώύ ψώϋώό ψϊό ψώϋώώώωψό ύ ψϊό ψόύϋόώύψϋόύϋϋύό ψϊό ψωϊώόψψωώϊψώϊψϊω ψϊό ψϋώψϋύψϋύψύϋ ψϊό ψόώψώψύϊψϊύ ψϊό ψόϊψώωψώωψωώ ψϊό ψϋύψύϊψώψ ψϊό ψώψύόϊψψωώψώ ψϊό ψώωώψύόϊψψωώψ ψϊό ψόόώψύϊψώψ ψϊόψώωϋψώωψώωψωώ ψϊόψωώψύϊψϊύ ψϊόψϋόψϋύψύϋ ψϊό ψόϊϋόύψώωώωψώϊψϋώ ψϊόψωϋϋψψϋύόψϋόύϋϋύϋψϋόύϋϊψύώύϋύψό όψωύψώωώ ό ψϋώώϋψωύψώωύ ˜ψϋ‘@@bς9ψϋΟ@@EΫ9ψϋςW@@­:ψό@@h ψζ@ζψϋΫE@@Υ ψζ@ζψόy@@ ψζ@Q Wώ\μψΥ@Ϋ ψζ@Δψω6tΡ ψό…@@s ψζ@ΔψϋE@Eςψώ]π ψϋςK@@Ύ ψζ@ΔψϋK@EμΟE ψϋΎ@@Kμ ψζ@ΔψφQ@@ΟKt““l“ψό…@@s ψζ@ΔψϋQ@@\@ψώπ.&ψόb@@‘ ψζ@ΔψQ@§ψϋ²Ut“²ψϋςE@@Δ ψζ@ΔψόQ@@\ψΫ@α ψζ @ώEμψχQ@@–ψ>ƒΊπ ψϋΚ@@Eς ψζ @ώEμψϋQ@@Ύψύ6tΙ ψόΎ@@K ψζ@W bώhςψϋQ@@Κψώ6Ρψό³@@W ψζ@ΔψϋQ@@ΚψώΊψό³@@W ψζ@ΔψωQ@@Κψd&ώπψό³@@W ψζ@ΔψόQ@@Κψύπ²U²ψόΎ@@K ψζ@ΔψόQ@@Κψͺ‹ψϋΚ@@Eς ψζ@ΔψόQ@@Κψθ‹ψΫ@α ψζ@ΔψόQ@@Κψ›²ψϋςE@@Δ ψζ@ΔψφQ@@Κψ‹››ƒEώπψόb@@‘ ψζ@ΔψϋQ@@ΚψώΊψόŠ@@s ψζ@Q \ψϋQ@@Κψώ&Α ψϋΔ@@Kμ ψζ@bψϋQ@@Κψ —ψϋςh@@–:ψό@@h:ψϋΚ@@Eα9ψϋς\@@§ ψ³@nψϋ‘@@\ς ψ³@nψϋζK@@Ύ ψ³@ Wψό–@@b ψό³@@KψωE“π ψϋςQ@@³ ψό³@@KψϊΎ@@yψψώ› ψϋΎ@@Kμ ψό³@@KψϊΔ@@sψ‘“ ψό@@y ψό³@@KψυΚ@@n­@‹›‹UώΩψόQ@@³ ψό³@@KψϊΚ@@WKWψΑtψΫ@Ϋ ψό³@@KψΚ@ώEΫψϋt]ƒ›ΙψόΈ@@K ψό³@@KψΚ@ψό‘@@b ψ³ @sψΚ@ϋΥψU“Ρψό…@@y ψ³ @sψϊΚ@@EςψόM“θ ψόy@@… ψ³@ bψϊΚ@@Qψψώdπψόs@@Š ψό³@@KψϊΚ@@Qψψώ.θψόn@@ ψό³@@KψψΚ@@QψψMdψόs@@Š ψό³@@KψόΚ@@Qψύΰ›6ώπψόy@@… ψό³@@KψόΚ@@QψUΩψόŠ@@y ψό³@@KψόΚ@@Qψ›Ωψό‘@@b ψό³@@KψόΚ@@QψEώπψόΎ@@K ψό³@@KψυΚ@@Qψψ“››t&dψΫ@Ϋ ψό³@@KψϊΚ@@Qψψώ&θψόQ@@³ ψ³@ \³ψϊΚ@@QψψώMθ ψό@@y ψ³@§ψόΚ@@Qψ —ψϋΥE@EΟ9ψϋς\@@§:ψόŠ@@n:ψϋΟ@@EΫ ψn@­ψόb@@– ψn@­ψϋΈ@@Kμ ψόn@@E WΈψό\@@‘ ψόn@@…ψϊώώύόω ψϋΔ@@Eζ ψόn@@…ψϊ@@Ύψψώύω ψό@@y ψόn@@…ψϊ…@@ΈμnώώωψϋςK@@Ύ ψόn@@…ψφ…@@­s@ϊϊϋύύψϋΚ@@Eμ ψόn@@…ψϊŠ@@b@yψϋωψό‘@@b ψόn@@…ψŠ@nψόόϋϋϊψόy@@… ψόn@@…ψŠ@Υψόb@@§ ψn @ΈψψŠ@@\ψψόϊψόK@@Έ ψn @ΈψϊŠ@@yψψύώόω ψϋςE@@Κ ψόn@@K bΔψϊŠ@@Šψψώώϊψμ@Ο ψόn@@…ψϊŠ@@Šψψϋψμ@Ο ψόn@@…ψψŠ@@Šψψύώωψμ@Ο ψόn@@…ψόŠ@@ŠψύωϋώόψϋςE@@Δ ψόn@@…ψόŠ@@ŠψώύψόQ@@Έ ψόn@@…ψόŠ@@Šψύύψόb@@§ ψόn@@…ψόŠ@@Šψώόψόy@@… ψόn@@…ψϊŠ@@Šψψϊώόώωψό‘@@b ψόn@@…ψϊŠ@@ŠψψϋψϋΚ@@Eμ ψόn@@K \αψϊŠ@@Šψψώώϋ ψϋςK@@Ύ ψn@αψόŠ@@Šψ ΎψώΫE>ψ³@ψψμ‘bE@QyΔψό­@@nψό³@@hψξα@@§ψ­W@\ΔψψΥnEEsα ψQ@ψό­@@nψό³@@hψϋα@@–­@όEαΫK@ώ\ςψϋ@W…s@Ύψό­@@nψό³@@hψρζ@@…KWŠW@@–yEy@Ύψ­ψϋΫK@@hψό­@@nψό³@@hψνζ@@KKζψαE@Q@³ψψ@@Šψϋ­@@Eμψό­@@nψό³@@hψζ@–ψόb@@WψόΎ@@sψζ@Υψό­@@nψό³@@hψζ@Οψόy@@ψόΥ@@bψόK@@Κψό­@@nψό³@@hψζ@μψό…@@‘ψόα@@\ψόQ@@Κψό­@@nψό³@@hψόζ@@KψόŠ@@³ψόα@@\ψόQ@@Κψό­@@nψό³@@hψόζ@@QψόŠ@@Έψόα@@\ψόQ@@Κψό­@@nψό³@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@Κψό­@@nψό³@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@Κψό­@@nψό³@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@Κψό­@@nψό§@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@Κψό³@@bψό…@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@ΚψόΈ@@QψϋςQ@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@ΚψΟ@Ϋψ§@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@ΚψϊςK@@sςψϊ­@b@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@ΚψŠ@υQ…–…W@WΔ@@hψόζ@@WψόŠ@@Έψόα@@\ψόQ@@Κψώςh@ϊWΫΥ@@bψόζ@@WψόŠ@@Έψόα@@\ψ Ύψώ§@>ψs>ψζψψΫ…W@EWŠαψόn@@­ψόn@@­ψο§@@αμ…KEsζψψ³\@Q– ψ@ώEΚψόn@@­ψόn@@­ψϋ­@@Υn@ύnψ­@– ψϋ@hŠŠb@ώQμψόn@@­ψόn@@­ψν­@@@n…E@@ΔKQŠb@@KςψΟψ­@§ψόn@@­ψόn@@­ψν­@@Kyψψ§@@WKζψμQ@@Κψόn@@sψόn@@­ψόn@@­ψ³@όΥψψα@ψόy@@³ψό­@@\ψόn@@­ψόn@@­ψό³@@QψϋςE@@Δψό–@@§ψόΔ@@Qψόn@@­ψόn@@­ψό³@@sψόK@@Ϋψό§@@–ψόΟ@@Kψόn@@­ψόn@@­ψό³@@…ψόQ@@μψό§@@–ψόΟ@@Kψόn@@­ψόn@@­ψό³@@ŠψόQ@Eμψό­@@–ψόΟ@@Kψόn@@­ψόn@@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@Kψόn@@­ψόn@@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@Kψόn@@­ψόn@@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@Kψόn@@­ψόb@@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@Kψόn@@§ψϋςK@@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@Kψόy@@ŠψΔ@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@Kψό@@\ψh@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@KψΎ@­ψωμy@\@@­ψό³@@ψόQ@Eςψό­@@–ψόΟ@@KψώςW@υbАyK@А@@§ψό³@@ψόQ@Eςψό­@@–ψόΟ@@KψώΟK@ϊyψ–@@‘ψό³@@ψόQ@Eςψό­@@–ψ ½ψύςh@=ψώαK>ψΈψψΎsK@Eh§ςψζ@ζψμ@αψοb@bψΥhEQ–ψψςŠK@\Δ ψ@ώbμψζ@ζψμ@αψϋh@\ΫK@ύ­ψn@ώEΥ ψϋEyQ@ψζ@ζψμ@αψξn@WyE…n@@\Έ@nŠK@@ ψμψώςs@αψζ@ζψμ@αψξn@EEΈψψh@@QsψψΔ@@QψϋζE@@³ψζ@ζψμ@αψόn@@\ψ§@ψΟψψςE@@μψόn@@–ψζ@ζψμ@αψόn@@ŠψϋΎ@@Kςψό\@@αψό…@@Šψζ@ζψμ@αψόn@@³ψόΔ@@bψόh@@ΫψόŠ@@…ψζ@ζψμ@αψόn@@ΔψόΚ@@nψόh@@ΥψόŠ@@…ψζ@ζψμ@αψόn@@ΚψόΚ@@sψόh@@ΥψόŠ@@…ψζ@ζψμ@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψζ@ζψμ@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψζ@ζψζ@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψζ@ζψα@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψζ@αψΔ@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψϋςE@@Οψ…@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψόW@@‘ψώΫE@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψϋ@@KΫψωΥWWK@@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψΟ@τEyn@@ΔW@@αψόn@@ΟψόΚ@@sψόh@@ΥψόŠ@@…ψ–@ωE³ψ\@@Ϋψόn@@ΟψόΚ@@sψόh@@Υψ €ψ@Κ<ψ@ώQζ;ψόs@@y;ψϋζK@@Ύ;ψϋ§@@Wς:ψϋςW@@§;ψϋ­@@Qς:ψϋμK@@ΈψΥ@Q'ψό…@@nψΥ@Q'ψϋΚ@@Eζ ψΥ@Q'ψϋςK@@Ύ ψΥ@Q(ψόs@@Š ψΥ@Q(ψό–@@n ψϋμ­§§³(ψόΈ@@Q;ψϋΚ@@Eς:ψΫ@ζ:ψα@α:ψα@Ϋ:ψα@α:ψΫ@ζ:ψϋΚ@@Eς:ψόΈ@@W ψμ­³(ψό–@@n ψΥ@Q(ψόn@@ ψΥ@Q'ψϋςK@@Ύ ψΥ@Q'ψϋΚ@@Eμ ψΥ@Q$ψ €ψύ@\μ<ψ@<ψόK@@Έ;ψϋ³@@Qμ;ψόh@@Š;ψϋΚ@@Eα;ψόn@@…;ψϋΎ@@Eμψ–@Š&ψϋςQ@@³ψ–@Š'ψόŠ@@nψ–@Š'ψϋΔ@@Eς ψ–@Š'ψϋμE@@Ο ψ–@Š(ψό\@@­ ψΟ§Κ(ψόs@@Š;ψόŠ@@y;ψό–@@n;ψό§@@h;ψό§@@b;ψό§@@h;ψό–@@n;ψόŠ@@y;ψόs@@ ψΟ­Κ(ψό\@@­ ψ–@Š'ψϋμE@@Ο ψ–@Š'ψϋΔ@@Kς ψ–@Š'ψό…@@sψ–@Š$ψ €ψώ@Š=ψ@Ύ<ψ@ώQζ;ψόs@@;ψϋΫE@@Κ;ψόŠ@@h;ψϋαE@@Κ;ψό@@sψW@Κ&ψϋΚ@@EζψW@Κ&ψϋςQ@@³ψW@Κ'ψό@@yψW@Κ'ψό³@@QψW@Κ'ψΥ@ζ ψϋΈ§§­ζ'ψϋμE@@Ο;ψόQ@@Ύ;ψό\@@­;ψόh@@§;ψόh@@‘;ψόh@@§;ψό\@@­;ψόQ@@Ύ:ψϋμE@@Ο ψΈ­ζ'ψΥ@ζ ψW@Κ'ψό³@@WψW@Κ'ψό@@ψW@Κ&ψϋςQ@@³ψW@Κ$ψ €ψ €ψ €ψ €$ψφθ“>>“πψͺΐψ$ψχε΄–‡€ƒ©Φψ₯€ΐψ$ψχ²U.lΡψώπΐψ>ψψΙU.‹πψϊƒ6›ψυΩƒ>6lΙ ψϋͺ]&ψψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψb@7ψb@7ψόb@@EK7ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@;ψόb@@ψ€Λψω˞‡€‡‘Φψω쩇€‹₯αψυΪ°–‡€€ƒ‘Γπ ψϊπΓ‘ƒ€χψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@6ψΫ@6ψΫ@K6ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υ:ψΫ@Υψΰψψθt&dΩψωΊ6&dπψυπ›M&&Uͺ ψϊΙl6χψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψ‘@6ψ‘@6ψ‘@K6ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@W;ψό‘@@WψϊM›π!ψΑ ψόΩt6ΔψΔ@μ:ψΔ@μ:ψΔ@μ:ψΔ@μ:ψΔ@μψχΚ…\E@EW…Οψο@EψαsEK…ςψψ‘Q@W­ψχα@@§ψ­W@\ψΔ@μψώμs@…ψϋ…@EζW@ύŠψŠ@Έψϋα@@–­@ψΔ@μψn@ϋh‘Š\@ψξŠ@E@yy@@EΚ@\ŠQ@@bψχζ@@…KWŠW@ψΔ@μψΔ@Έψϋ@@EαψρŠ@@K–ψψ…@@W\ςψΫ@τζψψζ@@KKζψαEψΔ@μψό@@nψϋςQ@@­ψψŠ@@EμψψΔ@³ψωb@@Οψψζ@–ψbψΔ@μψόΟ³‘Δψόy@@…ψόŠ@@nψΫ@αψωy@@Δψψζ@Οψy@μψόŠ@@ψόŠ@@ψϋα@@Eςψω@@Ύψψζ@μψ…@μψό@@yψόŠ@@§ψόζ@@Wψφ…@@Έψψζ@@KψŠK@μψϋζ§nWE@yψόŠ@@­ψόζ@@Wψφ…@@Έψψζ@@QψŠψΔ@μψώ‘E @yψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψ–@όKгΎΔόy@@yψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψϊΫE@@nμψό@@yψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψϋ§@@EζψόŠ@@yψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψό…@@nψόh@@yψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψό@@yψΫ@yψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψόŠ@@hψn@yψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψΈ@Υψως@…@@\ψόŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψσςQ@@K­ΟΚ§W@–Ο@χ‘ΟαψψŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψώΚE@όψψ\@ω‘ψψŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψΔ@μψψα…W@@WΟψταsE@QΈψψŠ@@³ψόζ@@Wψφ…@@Έψψζ@@WψŠψϋ€‡–°Ϊ"ψlU ψό²]&Δψό…@@n;ψό…@@n;ψό…@@n;ψό…@@n;ψό…@@nψφς³sQ@@Kb–ζψοE@ψΔ\@W³ψψζyKEhΥψχ§@@αμ…KEsψό…@@nψώΟQ@ώEΈψόK@yΔ@ύΚμW@ώKζψϋ­@@Υn@ψό…@@nψφαK@@Ey––K@ΚψξQ@sbKŠb@@y–@y…E@@‘ψχ­@@@n…E@ψό…@@nψϋ@@Qαψϋμb@@hψξQ@KEΥψςQ@KKψψ‘@@nψχ­@@Kyψψ§@ψό…@@nψϋςK@@­ψΚ@ζψόQ@@sψυ@@EζψψΫ@@Wψ³@ϋΥψψα@ψό…@@nψϋςΎ­–ζψϋςE@@ΚψόQ@@³ψό–@@hψόςE@Eψό³@@QψώςE@nψόW@@ΎψόQ@@Οψό§@@ψφK@Eςψψ³@@sψK@nψόW@@ΎψόQ@@αψό­@@ŠψφK@Eςψψ³@@…ψQKόE@@nψόϐhK@ΎψόQ@@ζψό­@@ψφK@Eςψψ³@@ŠψQψό…@@nψώμs @ΎψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψώςb@ύb–³ΔόQ@@ΎψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψ§@‘ψόW@@ΎψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψόb@@sψόQ@@ΎψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψόK@@­ψα@ΎψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψόE@@Ύψ‘@ΎψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψόQ@@§ψώαK@ΈψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψϋy@@\ςψωΫW\h@@–ψόQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψΚ@λhΎΥĊEEϊ@@QΎΟςψψQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψ–@όKΔψΥ@ωΫψψQ@@μψό­@@–ψφK@Eςψψ³@@ψQψό…@@nψψΔsK@Eb–ζψτΎ\@EbζψψQ@@μψό­@@–ψφK@Eςψψ³@@ψQψϋ>ƒΩ"ψώω ψόϊύώΔψόK@@³;ψόK@@³;ψόK@@³;ψόK@@³;ψόK@@³ψφα–hK@@Qs³ςψξΔ@@Δψ–QEhΥψψΚb@K…μψχb@bψΥhEQ–ψόK@@³ψ§@ώ\αψϋΚ@@Έ…@ύWςΚ@yψϋh@\ΫK@ψόK@@³ψ­@ϋQ…––n@ώ\ςψρΚ@@@bŠK@@³\K…n@Ϋψχn@WyE…n@@ψόK@@³ψϋςK@@yψϋΚE@@§ψνΚ@@KbςψΚ@@W@Οψψb@@­ψχn@EEΈψψh@ψόK@@³ψϋΎ@@EζψόŠ@@hψΟ@ψΈψψςK@@sψό‘@@ψόn@@\ψώ§@ψόK@@³ψόαΈ§§ψόΎ@@QψΟ@ζψό\@@§ψόΈ@@ψόn@@ŠψΎ@³ψόΟ@@EψόΟ@@Wψόh@@ΔψόΔ@@yψόn@@³ψΔ@³ψόΟ@@EψόΟ@@hψόn@@ΟψόΚ@@yψόn@@ΔψώΚ@K@³ψόΈ\E@EψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΚψώΚ@ψόK@@³ψώΚW @EψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψώΟE@ύy§ΈΔό§@@EψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψϋh@@KΟψόΟ@@EψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψα@³ψόΚ@@EψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψΔ@ζψό§@@EψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψϋΎ@@Eςψόb@@EψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψΟ@αψ­@ώEςψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψϋμE@@–ψύ³E…@ΫψόΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψ…@μŠΚΟ³n@bμW@@sΟΥψψΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψώμb@όbζψ–@ωbψψΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόK@@³ψψς‘bE@Kn³ψτςK@K…ψψΟ@@nψόn@@ΥψόΚ@@yψόn@@ΟψώΚ@ψόE“θ ψχΑ]&Uͺψdƒψόθ“MΐψχΔψψΥnEEsαψχζ‘nK@EWΚ ψόΔ@@sψύαŠW@s ψόEαΫK@ώ\ςψώ‘E@ώsμψψζ@@QψψΎE@s ψϊ@–yEy@Ύψ@ϋWЧ‘n@ώ\μψϊQ@@αΥE@s ψφ@Q@³ψψ@@ŠψΔ@‘ψϋΟQ@@…ψςh@@Δn@EŠΥςψμΫΥ ψ@WψόΎ@@sψόb@@ψϋΚ@@Eαψωy@@y@QΥψ@ψόΥ@@bψϋΟ@@Kμψόn@@‘ψ@Οψ@‘ψόα@@\ψό‘@@sψό§@@sψ–@…ψ@³ψόα@@\ψόy@@ŠψόΚ@@Wψ‘@Υψ@Έψόα@@\ψh@ώEςψό‘@@Qψ@Έψόα@@\ψb@μψό‘@@nψ@Έψόα@@\ψόb@@h –ώ‘ςψό‘@@yψ@Έψόα@@\ψόn@@ψό‘@@yψ@Έψόα@@\ψό@@yψό‘@@yψ@Έψόα@@\ψό§@@Wψό‘@@yψ@Έψόα@@\ψΫ@ΟψώαΚψό‘@@yψ@Έψόα@@\ψϋh@@hςψόs@KΎψό‘@@yψ@Έψόα@@\ψΟ@ώyμψϊμ@@Kμψό‘@@yψ@Έψόα@@\ψ‘@ϊK‘‘yE@Ύψό‘@@yψ@Έψόα@@\ψώ³E@ώQΔψό‘@@yψ@Έψόα@@\ψφμ‘hK@@Qs³ς ψό‘@@yψϋ&U² ψφπ›E.lΙψΡψόΡt>ΐψψζψψ³\@Q– ψχϊ\K@Kb–α ψό@@³ψύΔsK@Έ ψύnψ­@–ψώμs@ώE‘ψω­@@…ψψ…@Έ ψφ@ΔKQŠb@@Kςψώμ\@ϋh–§\@ψϊΚ@@hψ‘@Έ ψφ@WKζψμQ@@Κψϋ…@@KΟψ§@Δψρα@@KΫE@W§αψψζΟζ ψ@ψόy@@³ψΫ@ΟψόŠ@@hψψςE@@s@sςψ@Δψό–@@§ψό@@yψϋζE@@ΫψW@ώ\ςψ@Ϋψό§@@–ψόb@@Έψόh@@³ψ\@Κψ@μψό§@@–ψϋςE@@Οψό…@@ψόb@@\ψύ@Eμψό­@@–ψζ@yψόb@@Šψύ@Eςψό­@@–ψΫ@sψόb@@³ψύ@Eςψό­@@–ψα@Š –Έψόb@@Ύψύ@Eςψό­@@–ψζ@Οψόb@@Ύψύ@Eςψό­@@–ψϋςK@@Ύψόb@@Ύψύ@Eςψό­@@–ψόh@@ψόb@@Ύψύ@Eςψό­@@–ψϋ‘@@WςψώΚΫψόb@@Ύψύ@Eςψό­@@–ψϋαE@@‘ψϋαK@\μψόb@@Ύψύ@Eςψό­@@–ψ@­ψϋΥW@@yψόb@@Ύψύ@Eςψό­@@–ψώςh@ϋ\‘h@ώWζψόb@@Ύψύ@Eςψό­@@–ψώς@ώnζψόb@@Ύψύ@Eςψό­@@–ψχՊ\E@E\…Ο ψόb@@Ύψϋώύϋω ψψϋύώώύϋψωύψόωόύώΒψϊςŠK@\Δψφς³yWE@Qs³ςψυςK@Eμψψς§bE@μ ψύ­ψn@ώEΥψώΟW@ώQΟψωh@@Κψζ\@μ ψχ\Έ@nŠK@@ψςΚE@@E§§…K@@EΚψϊŠ@@§ςb@μ ψχ@QsψψΔ@@QψϊμQ@@nζψϊμs@@Wςψς§@@…­@@nΎμψςαΚ ψ@ψΟψψςE@@μψϋ‘@@\ςψϋμW@@§ψωΎ@@hQ@­ψύ@Kςψό\@@αψόW@@Ύψό­@@bψΟ@ψώ@bψόh@@ΫψϋΫ@@Eμψϋα@@EμψΥ@ώQςψώ@nψόh@@ΥψόΎ@@Q ψόK@@ΟψΫ@–ψώ@sψόh@@Υψ­@ΎψΫ@Οψώ@sψόh@@Υψ‘@³ψΫ@ζψώ@sψόh@@Υψό‘@@K –ΥψϋΫ@@Eςψώ@sψόh@@Υψό­@@WψόΫ@@Eψώ@sψόh@@ΥψϋΔ@@EςψόΫ@@Eψώ@sψόh@@Υψα@ΟψόΫ@@Eψώ@sψόh@@Υψόb@@ŠψώΎμψόΫ@@Eψώ@sψόh@@Υψϋ§@@EΫψό³@@…ψόΫ@@Eψώ@sψόh@@ΥψϊςW@@WΥψϋ­E@@ΎψόΫ@@Eψώ@sψόh@@ΥψώΥK@ϋn–‘ŠW@…ψόΫ@@Eψώ@sψόh@@ΥψώΥ\@ώE–ψόΫ@@Eψώ@sψόh@@ΥψχΈyQ@@Kh‘ζ ψόΫ@@Eψω.]² ψϋςK@@Ύ ψζ@bψόQ@@ΚψόŠ@@n;ψΫ@Ϋ;ψόy@@;ψϋΫE@@Υ;ψό@@h;ψϋς\@@­;ψϋΟ@@EΫ;ψϋ‘@@bς_ψθΊ;ψμΊ;ψπΊ;ψςΊ;ψόφ»ΊΊ<ψύ½ΊΊ<ψύΑΊΊ<ψύΕΊΊ<ψύΗΊΊ ψΕfεψύΛΊ» ψΕfεψύΟΊ½ ψӏώ“ξψύβΡΧŽψӏώ“ξ,ψΕfε,ψΕfεŸψω6tΡ ψϋΔ@@Kμ ψ³@§ψόΚ@@QψϋςQ@@³;ψό‘@@b;ψϋμK@@Ύ;ψϋ‘@@\ς:ψϋς\@@§;ψϋΚ@@Eα;ψό@@h;ψϋςh@@–`ψq!;ψ!;ψ™!;ψ !;ψό!!';ψό»!!.;ψόΘ!!;;ψόΦ!!I;ψόγ!!P ψf…ψόκ'!] ψf…ψύ'!j ψ³ͺψύqŽψ³ͺ-ψf…-ψf… ψώώόϊ ψό@@y ψn@αψόŠ@@ŠψϋΚ@@Eζ;ψόb@@‘;ψϋΈ@@Kμ;ψόb@@–;ψϋΟ@@EΫ;ψόŠ@@n;ψϋς\@@§;ψϋΥE@EΟ`ψό5!!.;ψό;!!;;ψόI!!I;ψόV!!V;ψόd!!d;ψόq!!q;ψό!!;ψό“!!“;ψό !!  ψώξjfΈψό!! ψώξjfΈψό»!!» ψώσ“Ξψόέxxݍψώσ“Ξ,ψώξjfΈ,ψώξjfΈ ψψόQ@@Κψςς­hE@Eb‘ςψΫ@@\ψόζ@@WψόŠ@@Έψόα@@\Θψ³=ψώΫEψψΣ¦ŠxŠŠ―ά5ψώӊfζ3ψΑfύŠΚξ5ψΑfψΡψβΊΧψΑfψθΊώΡΥψζΊάψΐfξψμΊώΥΪψθΊΰψΐfψπΊώΪήψμΊδ ψΑfŠψςΊώήβψπΊθ ψΑfxψϊφ»ΊΊβζψτΊμ ψΚΑfώ›υψϋ½ΊΊζκψϋφ»ΊΊπψΑ fό›ττυψϋΑΊΊκξψό½ΊΊτψΚ f›τυψϋΕΊΊξςψόΑΊ»φψΣfύx›τφψϋΗΊΊςφψύΕΊΏ ψΑfόΈψψχτφψόΛΊ»φψύΗΊΑ ψΑfΣψχτφψύΟΊ½ψύήΡΪ ψΑfΣψχτφψύβΡΧψόΑffψφτφ-ψώΚΣψφτφ7ψφτφ7ψφτφ7ψφτφ7ψφτφ7ψφτχ7ψφτχ7ψφτχ7ψφτχ7ψυτχ7ψυτφ7ψυτχ7ψυτφ8ψυτυ9ψυτφ:ψόφυφχψψόΟ@@KψςζŠ\E@KsΎψψ‘@@–ψό³@@ψόQ@Eςψό­@@–ˆψζ>ψs=ψώ§@ψψΧ•…••Άί5ψώΧ•uθ3ψΗuύ–Οο5ψΗu¦ψ»ψ]!ΦψΗu¦ψq!ώ»Θψj!έψ³uοψ!ώΘΦψx!κψ²uψ™!ώΦγψό…!!'ψΗu–ψ !ώγρψό™!!5 ψΗu}ψϋ!!'ρψό§!!B ψΟΗuώ»ψό»!!.ψό΄!!P ψΗ uόΊψόΘ!!;ψό»!!VψΟ uΊψόΦ!!IψόΘ!!dψΧuύ…†Ύψόγ!!PψόΦ!!q ψΗuόΎψψ͐Ύψόκ'!]ψόγ!! ψΗuΧψ͐Αψύ'!jψόρxq» ψΗuΧψ͐ΑψύqψόΗuu¦ψʐΔ-ψώΟΧψʐΗ7ψǐΗ7ψǐΚ7ψĐΚ7ψΑΚ7ψΑΝ7ψΎΝ7ψΎΠ7ψΎΠ7ψΊΠ7ψΊ7ψ·α7ψ·΄8ψ·°9ψ·Σ:ψόΗͺ΄ΫψψόŠ@@…ψςΚyQ@@W…Ϋψψb@@Υψόn@@ΟψόΚ@@sψόh@@ΥˆψΈ=ψώαK<ψύςh@ψψΪ΄Ž»α5ψώڝι3ψΛύπ5ψΛ¬ ψϋκ'!!BψΛ¬ψό5!!.ψό'!!Pψžπψό;!!;ψό5!!]ψ›•ψόI!!IψόB!!jψ˝ψόV!!VψόI!!x ψΛ{ψόd!!dψόV!!… ψΛώSnψόq!!qψόd!!™ ψΛ όS mψό!!ψόq!!§ψ S mψό“!!“ψό!!΄ψΪύŽ„S sψό !! ψό“!!Β ψΛόΓψψ– sψό!!ψό !!Ο ψΛΪψ– {ψό»!!»ψόΘqxγ ψΛΪψ– {ψόέxxέψόΛ¬ψ ‚-ψώΪψ ˆ7ψˆ ˆ7ψˆ 7ψ‚ 7ψ{ 7ψ{ –7ψs –7ψs 7ψs 7ψm 7ψm £7ψf Ε6ψώχf ]7ψώχf T8ψώχf €:ψόˆG\·ψψό…@@sψΥ@Q&ψϋμK@@Έ:ψϋ­@@Wς9ψϋςW@@§:ψϋ§@@Wς9ψϋζK@@Ύ:ψόs@@y;ψ@ώQζ;ψ@Κ@ψβΊΧ:ψζΊά:ψθΊΰ:ψμΊδ:ψπΊθ:ψτΊμ:ψϋφ»ΊΊπ;ψό½ΊΊτ;ψόΑΊ»φ;ψύΕΊΏ<ψύΗΊΑ<ψύήΡΪωψψϋςQ@@³ψ–@Š&ψϋΎ@@Kμ:ψόn@@Š:ψϋΚ@@Eα:ψόh@@Š:ψϋ³@@Qμ:ψόK@@Έ;ψ@<ψύ@\μ@ψ]!Φ:ψj!έ:ψx!κ:ψό…!!';ψό™!!5;ψό§!!B;ψό΄!!P;ψό»!!V;ψόΘ!!d;ψόΦ!!q;ψόγ!!;ψόρxq»ωψψϋΚ@@EζψW@Κ&ψό@@y:ψϋαE@@Κ:ψόŠ@@h:ψϋΫE@@Ο:ψόs@@;ψ@ώQζ;ψ@Ύ<ψώ@Š@ψϋκ'!!B;ψό'!!P;ψό5!!];ψόB!!j;ψόI!!x;ψόV!!…;ψόd!!™;ψόq!!§;ψό!!΄;ψό“!!Β;ψό !!Ο;ψόΘqxγωψ €ψ €ψ €ψ €ψψψ»ψϋՐhQE8ψώμs@7ψώμ\@ύEn7ψ@ώ–ς9ψόQ@@Š:ψζ@Ο:ψζ@Ϋ:ψϋςK@@³;ψϋy@@KΚ:ψώΫE@ύnΈζ8ψώΟQ@9ψύς§\@<ψύΫ§s6ψϋμ­…bζ:ψϋζE@@‘;ψϋs@@KΥ:ψωΥE@@K§μ9ψ³@ώ\n8ψώΔW@:ψϋΎ…\K@€ψ»ψϋΎbK@8ψώΚW@7ψώΚE@ύQs…7ψϋ\@@QΔ9ψΟ@Κ:ψό­@@Q;ψό­@@\;ψϋΎ@@Eζ:ψϊμK@@hζ:ψ§@όE…Κς8ψ‘@9ψύαŠK@<ψύΚ–b6ψόΥ‘sy;ψ­@Ϋ:ψϊζE@@hς:ψ–@ώbΔ:ψs@ύKhs8ψώ–E@9ψϊζ­sWE@€ψΊψϊζ§sWE@8ψώ‘E@7ψ@ύ\y…6ψΟ@ώnα9ψϋŠ@@Wς:ψόn@@Š;ψόh@@–;ψό@@n;ψΈ@–;ψh@ύW‘Υ8ψώμs@K9ψώΔs@;ψόμΈ…W6ψόΎh³;ψόn@@b;ψ³@§:ψώςb@ώ…Ϋ9ψώΫQ@ύWns7ψώζs@9ψϊՐhQ@@€ψ€ψϋ@E\Έ:ψ@ώWΟ8ψύnK@ώKΫ9ψώς§@n;ψ­@Υψσn@@Έψς‘bE@KsΔ ψφμ§nQ@@Kn§μψωn@@Κψψ³ψϋςK@WΈψϊs@@³α\@ψώΎK@ώQΟψωs@@Δζb@ψώΫςψυy@@‘b@Q……Q@ψΚ@φK––yE@@Kαψωy@@Έh@K ψϊy@@W@ψϊςy@@Eαψϋb@@bμψϋΫQ@@…ψωy@@b@…ς ψy@sψϋμQ@@–ψΫ@Κψό­@@Qψy@yψy@Οψό@@bψϋμΎ§–ςψΫ@ζψυy@@EαψψWŠΎς ψόy@@QψϋΔ@@Eςψμ@Ϋψόy@@nψ@ύEsΔψόy@@sψΫ@αψμ@Ϋψόy@@ŠψE@ώnζψόy@@Šψζ@ΥψόΔ…bK@Ϋψόy@@–ψύΥ–Q@ώ\μψόy@@ψμ@ΟψώΫb @Ϋψόy@@–ψ–@ψόy@@–ψμ@ΟψώζQ@ύn‘ΈΔΎ@Ϋψόy@@–ψό…@@Qψόy@@Šψζ@Υψ…@Ύψμ@Ϋψόy@@–ψΟ@αψόy@@ψΫ@ζψϋςK@@ψζ@Ϋψόy@@–ψΥ@Ϋψόy@@bψϋΔ@@Kςψα@ΚψΔ@Ϋψόy@@–ψϋΈ@@Eμψϋy@@Eζψό@@hψΫ@Υψ@Ϋψόy@@–ψϋμ\@@bψy@–ψϋςQ@@‘ψζ@ΔψΚ@Υψόy@@–ψώΚ\@Ύψϊy@@EEΎψϋ…@@Eζψό\@@yψωΚKsQ@@Ύψόy@@–ψύsbK@Šψυy@@ŠQ@h–­–\@‘ψ­@ςyΔΟΎy@Qζn@@\ΚΟψόy@@–ψ@ώK­ψϊy@@–ΟK@Šψy@όWΫψΈ@Eψόy@@–ψϊ@E\y³ςψσy@@–ψμ–bE@KsΔ ψψ³hE@Kh§ςψϋ§W@Khψόy@@–ψόy@@–;ψόy@@–;ψόy@@–;ψόy@@–;ψόy@@–;ψόy@@–;ψόy@@–;ψόy@@–ψό\@@y;ψό\@@y;ψό\@@yψ€ψϋ@KbŠΟ:ψ@ώyμ8ψώb@h:ψώζy@­;ψόn@@Wψςμ@@EςψΫ…W@@W…Ϋ ψχՊbK@EWyΎψψμ@@Qψψζ–ψϋΔ@@bζψωςE@@ζΎE@ώEΈψŠ@ώnμψψςE@KψΔK@ψώςΫψυςE@@ΎE@bАs@ΟψŠ@ϋ\Š–b@sψψςE@EΟE@\ ψωςE@@WKΔψϋΫQ@@hψΫ@–ψ³@ΔψωςE@@\E³ψE@ΈψΔ@Υψϋ‘@@Wςψόn@@…ψE@ΈψόE@@WψόW@@§ψόΫ³‘³ψό‘@@hψόE@@hψύh–Ο ψόE@@Šψό@@ψό³@@bψόE@@­ψ@ύQŠαψόE@@Έψό‘@@hψόΈ@@bψόE@@Οψ@–ψόE@@Κψό³@@\ψϋς­yWE@bψόE@@ΥψόςΔ…E@ψόE@@ΥψόΈ@@WψώΈK @bψόE@@Ϋψώζh@ΟψόE@@Υψό³@@WψΈ@όE­ΎΔό@@bψόE@@ΫψϋμQ@@ŠψόE@@Οψό­@@\ψϊςQ@@\αψόΈ@@bψόE@@ΫψόŠ@@hψόE@@Ύψό–@@hψΔ@Οψό­@@bψόE@@Ϋψό–@@bψόE@@‘ψό@@ψό§@@Qψό…@@bψόE@@Ϋψόs@@sψόE@@nψόW@@­ψό‘@@\ψϋμK@@bψόE@@ΫψΚ@§ψE@ΥψΔ@Ϋψϋ­@@KςψŠ@\ψόE@@Ϋψως§E@@KμψϊE@@E\αψϋζW@@nψΥ@Έψω–@…@@EςψόE@@Ϋψώn\@ώEΔψρE@@–@E§­ŠK@@EΥψξh@@E‘ΟΟ­b@yζE@@…ΟΫψόE@@Ϋψ@ώ\ΟψϋE@@Υ‘@ώEΎψώαQ@όyςψy@ψόE@@Ϋψϋ@KbŠΚψσE@@ΥψΥW@@WŠαψψμ\@@QyΔψϊμK@Q‘ψόE@@ΫψόE@@Υ;ψόE@@Υ;ψόE@@Υ;ψόE@@Υ;ψόE@@Υ;ψόE@@Υ;ψόE@@Υ;ψόE@@ΥψΫ@Ύ:ψΫ@Ύ:ψΫ@Ύψ€ψϋEQn§ζ:ψ@ώE§9ψώyW@§:ψϊΚW@@Eα:ψϋαE@@ψς³@@yψψΎsQ@Eb§ς ψχΎyWE@E\ŠΫψψ³@@ŠψψΟψό…@K…ψϊΈ@@nψ…@ώWαψώαb@‘ψψΈ@@…ψ@@ψζψυΎ@@h‘@EsŠb@ώ\ςψώμW@ϋs–…Q@³ψψΈ@@y‘@@n ψωΎ@@QEhζψ³@§ψϋ‘@@EΟψϊςy@@QςψωΎ@@\E\Ϋ ψΎ@ώKζψό@@\ψόb@@ŠψϋζE@@ΚψΎ@ώQζψΎ@ψΟ@αψόΔ­–Υψόb@@­ψΎ@§ψύy­α ψΎ@ΟψϋςK@@Ύψόn@@‘ψΎ@ζψ@ύb­ςψϋΎ@@Eμψό\@@§ψόs@@‘ψόΎ@@Qψ@ώQΚψόΎ@@Qψόn@@–ψϋΫ–nQE@‘ψόΎ@@\ψύα³h@ώEΚψόΎ@@Wψόs@@ψώς… @‘ψόΎ@@\ψϋΚK@@\ψόΎ@@Wψόs@@ψy@όW³ΎΔόb@@‘ψόΎ@@\ψΔ@ΚψόΎ@@Qψόn@@–ψΔ@…ψόs@@‘ψόΎ@@\ψόQ@@§ψϋΎ@@Eςψό\@@­ψϋ@@Wςψόn@@‘ψόΎ@@\ψό\@@‘ψΎ@αψϋςK@@Δψόh@@ŠψϋςK@@‘ψόΎ@@\ψϋμE@@³ψΎ@­ψΟ@ζψόb@@–ψΎ@‘ψόΎ@@\ψŠ@αψΎ@\ψό…@@bψόn@@…ψώμ\@–ψόΎ@@\ψώα@yψωΎ@@E@…ςψΎ@³ψϋ–@@KζψωζhKy@@yψόΎ@@\ψώhQ@ώ\μψυΎ@@by@WŠ­§s@ώbςψναE@@\ΈΟΚ–K@Έ³@@E³ΟμψόΎ@@\ψ@ώμψϊΎ@@\μn@ώ\ζψ³@ϋE­ψζK@ΔψόΎ@@\ψϋEQn‘αψςΎ@@\ψψΈnK@Eb§ςψψΟyQ@E\ŠαψϊΟhEEWΟψόΎ@@\ψόΎ@@\;ψόΎ@@\;ψόΎ@@\;ψόΎ@@\;ψόΎ@@\;ψόΎ@@\;ψόΎ@@\;ψόΎ@@\ψϋ–@@Eς:ψϋ–@@Eς:ψϋ–@@Eςψ€ψϊnK@Kh³ψσE@Eςψμ‘bE@QyΔ ψχΎWE@Kh§μ ψϋ@@§ψ@ώnςψϊK@EμΟQ@ψώαb@ώKΈψχΈ@@yψyK@ŠψφQ@@ΟK@W…s@ΎψώαQ@ϋs‘§ŠQ@³ψόΥ@@Wψϊμh@@EμψϊQ@@\@­ψϋΫK@@hψϋh@@\Ϋψϊς…@@EαψϋμE@EαψΫ@ΔψQ@§ψϋ­@@EμψϋΎ@@Kαψόn@@…ψόQ@@yψό\@@§ψόQ@@\ψζ@Υψόs@@–ψϋΚ@@Kςψb@ψόs@@–ψόQ@@–ψόK@@ΚψϋςE@@ΟψϋςK@@Οψn@ψό@@–ψόQ@@ΎψόQ@@ΚψΫ@ζψόh@@³ψόn@@Qψό@@–ψόQ@@ΚψόQ@@ΚψΚ@‘ψόn@@ψό@@–ψόQ@@ΚψόQ@@ΚψΔ@ψόn@@‘ψό@@–ψόQ@@ΚψόQ@@ΚψΔ@ –Δψόn@@­ψό@@–ψόQ@@ΚψόQ@@ΚψΚ@μψόn@@­ψό@@–ψόQ@@ΚψόQ@@Κψα@Ϋψόn@@­ψό@@–ψόQ@@ΚψόQ@@ΚψόK@@³ψόn@@­ψό@@–ψόQ@@ΚψόQ@@Κψόy@@nψώΔζψόn@@­ψό@@–ψόQ@@ΚψόQ@@ΚψΚ@ΎψόΟ@@nψόn@@­ψό@@–ψόQ@@ΚψόQ@@Κψϋs@@EΔψϋΔK@@‘ψόn@@­ψό@@–ψόQ@@ΚψόQ@@ΚψώζW@ϋb‘Š\@ώhςψόn@@­ψό@@–ψόQ@@ΚψόQ@@Κψώζn@ώςψόn@@­ψό@@–ψόQ@@ΚψόQ@@ΚψχΚWE@EbΫ ψόn@@­€ψ€ψϊ\E@QyΟψςΎ@@yψψΫ…W@EWŠα ψχμ§sQ@@WyΎ ψϋW@@αψ@‘ψϊΔ@@sψ‘@ώEΚψώΈK@ώbΫψψy@@Έψ…n@ΚψυΚ@@n­@@hŠŠb@ώQμψ³@φK…§‘yE@@Qαψό–@@ψϋΟE@@yψωΚ@@WKWΟψ­@§ψϊΫE@@…ςψϋα\@@hψϋΈ@@sΈψϋ‘@@KςψΚ@ώEΫψόn@@sψό@@sψϋαE@@ΔψϋΟ@@\\ψΥ@αψΚ@ψό­@@\ψϋμE@@ΥψόŠ@@ψΫ@ψϋςE@@ΥψΚ@ΥψόΔ@@QψόΎ@@WψόΔ@@Wψζ@KψόE@@ΥψϋΚ@@EςψόΟ@@Kψό‘@@nψα@μψζ@…ψόE@@ΥψόΚ@@QψόΟ@@Kψ…@Ϋψζ@ΎψόE@@ΥψόΚ@@QψόΟ@@Kψ@Οψζ@ΫψόE@@ΥψόΚ@@QψόΟ@@Kψό@@\ –ώ‘ζψζ@ζψόE@@ΥψόΚ@@QψόΟ@@KψόŠ@@sψζ@ζψόE@@ΥψόΚ@@QψόΟ@@Kψό§@@\ψζ@ζψόE@@ΥψόΚ@@QψόΟ@@KψϋΚ@@Eμψζ@ζψόE@@ΥψόΚ@@QψόΟ@@KψϋμK@@­ψύμΔςψζ@ζψόE@@ΥψόΚ@@QψόΟ@@Kψϋ…@@Qμψό@E§ψζ@ζψόE@@ΥψόΚ@@QψόΟ@@KψϊαK@@bαψώς–@Υψζ@ζψόE@@ΥψόΚ@@QψόΟ@@KψΎ@ϊEy‘‘K@‘ψζ@ζψόE@@ΥψόΚ@@QψόΟ@@KψώΔQ@ώK³ψζ@ζψόE@@ΥψόΚ@@QψόΟ@@Kψφς­sQ@@Kn§μ ψζ@ζ€ψ€ψϊQ@E\ζψς@@ΎψψΎsK@Eh§ς ψχېbK@E\ŠΥ ψϊΟ@@bψψ@ώKΥψϊ…@@Έμn@ώbμψώςŠ@ώ…ςψχςE@EςψŠŠ\@ώWςψυ…@@­s@EyQ@ψs@ϋb§–h@sψϋ\@@Υαψ‘@ΈψωŠ@@b@yμψώςs@αψϋ§@@EΈψϋΎE@@§ψϋs@@Έyψόb@@ψŠ@nψϋζE@@³ψϋμK@@³ψϋ­@@QςψϋŠ@@s@ψό–@@hψŠ@Υψόn@@–ψό³@@\ψϋςQ@@Δψ‘@ψόΈ@@\ψόŠ@@\ψό…@@Šψό@@ψό…@@ψ­@yψόΎ@@\ψόŠ@@yψόŠ@@…ψό\@@³ψό§@@nψ­@ΚψόΎ@@\ψόŠ@@ŠψόŠ@@…ψQ@\ψϋ­@@EςψόΎ@@\ψόŠ@@ŠψόŠ@@…ψE@Wψό­@@bψόΎ@@\ψόŠ@@ŠψόŠ@@…ψόE@@y –§ψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψόQ@@³ψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψόb@@‘ψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψό…@@sψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψϋΎ@@EζψΥψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψϋςQ@@ψϋς\@QΥψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψ³@ώςψϋαh@@bψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψ@ϋQŠ‘–n@ώKΥψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψ–@ώ\Υψό­@@nψόΎ@@\ψόŠ@@ŠψόŠ@@…ψχα–bK@EWΎ ψό­@@nψ‚ψύΚyQ@§6ψ@§5ψ­@§ψxfœ ψφK@Q‘αςψμΥαψxfœ ψύ@hμ ψ‘Ό ψώWμ=ψΈ>ψς#ψ‘Ό-ψxfœ-ψxfœ ψ‚ψύ­hE@α5ψώμb@α5ψn@αψάfΞ ψ@ψhΈζψςαΚςψάfΞ ψώ@– ψώ哏ώ“ά ψ…>ψμbψώ哏ώ“ά,ψάfΞ,ψάfΞ ψψόζWE@h6ψώΚK@h6ψK@hψ₯fo ψ@ω…ΟμψμΫΟψ₯fo ψώKΚ ψŏ˜ ψΔ’ψŏ˜-ψ₯fo-ψ₯fo ψ¬ψϊκ–ˆΉκ9ψάˆΉ9ψ²ˆ9ψ²ˆΉ9ψ²ˆγψΗΊπψϋΑΊΊ»φψˆΉψΛΊτψόΕΊΊ½ψώγΥψ–ˆ–ψόΟΊΊ»ψόΙΊΊΑψύ–ˆ²ψκˆψόΣΊΊΏψόΝΊΊΕψˆ²ψ€ˆψόΧΊΊΓψόΟΊΊΙψˆϋ²ψψκ€ˆ–ψόάΊΊΗψόΣΊΊΝψΉˆώ–ˆΞψόΰΊΊΛψόΧΊΊΡψγˆΞψόδΊΊΝψόάΊΊΥψΉˆΞψόθΊΊΡψόΰΊΊΪ ψˆΞψόμΊΊΧψόδΊΊή ψΉˆΞψόξΊΊάψόθΊΊβ ψϊγΉ–ˆˆ– ˆΞψότΣΡκψόπΣΣμψΞ ˆΞ3ψΞ ˆΞ3ψΞ ˆΞ3ψΞ ˆΞ3ψΞ ˆ4ψΞ ˆ5ψΞˆ6ψΞˆ7ψΞˆ8ψΞˆ9ψ–ˆ9ψˆ9ψˆ9ψ–ˆ–9ψ²ˆ9ψγˆ:ψΉˆ;ψˆ<ψύΉˆˆ=ψώκΉψφ>ψδ=ψώξέ=ψώεέ&ψϋφ»ΊΊΓψπΊΙ ψώαέ'ψό½ΊΊΕψτΊΛ ψέ'ψόΑΊΊΙψϋφ»ΊΊΟ ψώδέ¬ψϊμ€™«Γμ9ψΰ™Γ9ψ½™«9ψ½™Β9ψ½™ζψγ!PψΟ!dψŸ™Βψϋρ'!!]ψΦ!qψώζΪψ€™€ψό'!!jψγ!ψύ€™Όψμ™ψό5!!xψϋρ'!!“ψ™Όψ°™ψόB!!…ψό.!! ψͺ™ϋΌψψμ°™₯ψόP!!™ψό5!!ψΒ™ώŸ€™Τψό]!!§ψόB!!»ψζ™Τψόd!!΄ψόP!!ΘψΒ™Τψόq!!Βψό]!!Φ ψͺ™Τψό!!Οψόd!!γ ψΒ™Τψό“!!έψόq!'κ ψϊζΒ₯™™₯ ™ΤψόΒqxρψύ΄qxψΤ ™Τ3ψΤ ™Τ3ψΤ ™Τ3ψΤ ™Τ3ψΤ ™4ψΤ ™5ψΤ™6ψΤ™7ψΤ™8ψΤ™9ψ€™9ψ™9ψ™9ψ₯™₯9ψ½™Ÿ9ψζ™:ψΒ™;ψͺ™<ψύΒ™™=ψώμΒψλ>ψ`=ψώ¬.=ψώl.&ψ΄!…ψ™!  ψώG.&ψ»!™ψ§! ψ.&ψΘ!§ψ΄!» ψώ`.¬ψϊξ°¦΅Κξ9ψδ¦Κ9ψΕ¦΅9ψΕ¦Κ9ψΕ¦θψ !™ψ!΄ψ«¦Κψ!§ψ“!Βψώθήψ°¦°ψ»!΄ψ !Θψύ°¦Δψξ¦ψΘ!Βψ!Φψ¦ΔψΊ¦ψΟ!Οψ»!γψ΅¦ϋΔψψξΊ¦°ψέ!έψϋΘ!!'ρψΚ¦ώ«°¦Ωψκ!κψόΦ!!.ψθ¦Ωψϋρ'!'ρψόέ!!; ψΚ¦Ωψύ5!5ψόκ!!B ψ΅¦Ωψύ;!Bψόρ'!P ψΚ¦ΩψύI!Iψύ5!] ψϊθΚ°¦¦° ¦Ωψύ™q™ψύ…q§ψΩ ¦Ω3ψΩ ¦Ω3ψΩ ¦Ω3ψΩ ¦Ω3ψΩ ¦4ψΩ ¦5ψΩ¦6ψΩ¦7ψΩ¦8ψΩ¦9ψ°¦9ψ¦9ψ¦9ψ°¦°9ψΕ¦«9ψθ¦:ψΚ¦;ψ΅¦<ψύΚ¦¦=ψώξΚψμ>ψq=ψώ΄D=ψώ|D&ψd!ΟψP!γ ψώZD&ψq!έψϋV!!'ρ ψD&ψ!κψόd!!. ψώqDΡψΗΊπψϋΑΊΊ»φ2ψΛΊτψόΕΊΊ½3ψόΟΊΊ»ψόΙΊΊΑ3ψόΣΊΊΏψόΝΊΊΕ3ψόΧΊΊΓψόΟΊΊΙ3ψόάΊΊΗψόΣΊΊΝ3ψόΰΊΊΛψόΧΊΊΡ3ψόδΊΊΝψόάΊΊΥ3ψόθΊΊΡψόΰΊΊΪ3ψόμΊΊΧψόδΊΊή3ψόξΊΊάψόθΊΊβ3ψότΣΡκψόπΣΣμγψϊ–ˆˆ–Ήγ9ψˆΉ8ψˆ7ψˆΉ6ψˆκ5ψˆώ–ˆΉ5ψϊˆ€κψψ²ˆ5ψ€ψ²ˆ5ψκψύ²ˆ–=ψώΥγuψ²>ψώˆ²=ψˆ²<ψˆά;ψόˆ–κ½ψϊξεγγηυ ψϊυηγγεν$ψγέκ ψλέώγφ"ψέωβλείέέι ψφιέέίελβέέγ"ψώέιψϋφβέέοψϋοέέβφψόιέέξ!ψαψόφαέΰψόαέαφψύαέε!ψλψόξέέοψόξέέξψύλέΰψϋφ»ΊΊΓψπΊΙ ψλψόσέέγψόδέέσψύλέέψό½ΊΊΕψτΊΛ ψηψυέςψςέυψύηέδψόΑΊΊΙψϋφ»ΊΊΟ ψΠψγ!PψΟ!d2ψϋρ'!!]ψΦ!q3ψό'!!jψγ!3ψό5!!xψϋρ'!!“3ψόB!!…ψό.!! 3ψόP!!™ψό5!!3ψό]!!§ψόB!!»3ψόd!!΄ψόP!!Θ3ψόq!!Βψό]!!Φ3ψό!!Οψόd!!γ3ψό“!!έψόq!'κ3ψόΒqxρψύ΄qxδψϊ€™™€Γζ9ψ™Γ8ψ™«7ψ™Β6ψ™μ5ψ™ώ₯Ÿ™Β5ψϊ™±μψψ½™«5ψ±ψ½™5ψμψύ½™₯=ψώΪζuψΌ>ψώ™Ό=ψ™Ό<ψ™ΰ;ψόͺ™₯μ½ψϊ¬m``yή ψϊήy``m¬$ψ`.“ ψ“.ώ`λ"ψ.ωS“l:..† ψφ†..:l“S..`"ψώ.†ψϋλS..ΈψϋΈ..Sλψό†..¬!ψGψόλG.GψόG.GλψύG.l!ψ“ψό¬..Έψό¬..¬ψύ“.Gψ΄!…ψ™!  ψ“ψόΡ..`ψό`..Ρψύ“..ψ»!™ψ§! ψyψή.ΕψΕ.ήψύy.`ψΘ!§ψ΄!» ψΠψ !™ψ!΄2ψ!§ψ“!Β2ψ»!΄ψ !Θ2ψΘ!Βψ!Φ2ψΟ!Οψ»!γ2ψέ!έψϋΘ!!'ρ2ψκ!κψόΦ!!.3ψϋρ'!'ρψόέ!!;4ψύ5!5ψόκ!!B4ψύ;!Bψόρ'!P4ψύI!Iψύ5!]4ψύ™q™ψύ…q§δψϊ°¦¦°Κθ9ψ¦Κ8ψ¦΅7ψ¦Κ6ψ¦ξ5ψ¦ώ°«¦Κ5ψϊ¦»ξψψΕ¦΅5ψ»ψΕ¦5ψξψύΕ¦°=ψώήθuψΔ>ψώ¦Δ=ψ¦Δ<ψ¦δ;ψό΅¦°ξ½ψϊ΄|qq‡α ψϊα‡qq|΄$ψqDž ψžDώqμ"ψDωež|ODD’ ψφ’DDO|žeDDq"ψώD’ψϋμeDDΏψϋΏDDeμψό’DD΄!ψZψόμZDZψόZDZμψύZD|!ψžψό΄DDΏψό΄DD΄ψύžDZψd!ΟψP!γ ψžψόΦDDqψόqDDΦψύžDDψq!έψϋV!!'ρ ψ‡ψαDΛψΛDαψύ‡Dqψ!κψόd!!. ψ €ψ €ψ €ψ €ψψψ:ψϋՐhQE8ψώμs@7ψώμ\@ύEn7ψ@ώ–ς9ψόQ@@Š:ψζ@Ο:ψζ@Ϋ:ψϋςK@@³;ψϋy@@KΚ:ψώΫE@ύnΈζ8ψώΟQ@9ψύς§\@<ψύΫ§s6ψϋμ­…bζ:ψϋζE@@‘;ψϋs@@KΥ:ψωΥE@@K§μ9ψ³@ώ\n8ψώΔW@:ψϋΎ…\K@ ψ:ψϋΎbK@8ψώΚW@7ψώΚE@ύQs…7ψϋ\@@QΔ9ψΟ@Κ:ψό­@@Q;ψό­@@\;ψϋΎ@@Eζ:ψϊμK@@hζ:ψ§@όE…Κς8ψ‘@9ψύαŠK@<ψύΚ–b6ψόΥ‘sy;ψ­@Ϋ:ψϊζE@@hς:ψ–@ώbΔ:ψs@ύKhs8ψώ–E@9ψϊζ­sWE@ ψ9ψϊζ§sWE@8ψώ‘E@7ψ@ύ\y…6ψΟ@ώnα9ψϋŠ@@Wς:ψόn@@Š;ψόh@@–;ψό@@n;ψΈ@–;ψh@ύW‘Υ8ψώμs@K9ψώΔs@;ψόμΈ…W6ψόΎh³;ψόn@@b;ψ³@§:ψώςb@ώ…Ϋ9ψώΫQ@ύWns7ψώζs@9ψϊՐhQ@@ ψϋ@E\Έ$ψό³‘‘Ύψ@ώWΟ8ψύnK@ώKΫ9ψώς§@n;ψ­@ΥψχΎWE@Kn§μψζ@y ψόζ‘hKψϋςK@WΈψώΥW@ώK³ψζ@y ψώ³E@ψώΫςψφΔE@@EnŠŠnE@§ψμŠόh@@y ψΎ@ώb ψϊζK@@nζψϊζs@@EΥ ψό‘@@y ψό\@@³ψϋŠ@@\ςψϋςW@@ ψό‘@@y ψόα@@bψϋςK@@Έψό‘EQh ψό‘@@y ψόΟ@@hψόWŠΎςψϋΚ@@Eμψό‘@@y ψωΫ@@EΟψψ@ύEsΔψό§@@\ψό‘@@y ψω\@@EŠΥE@ώnζψόŠ@@nψό‘@@y ψώΟE@όψΥ–Q@ώ\μψό…@@sψό‘@@y ψώΫh@ψ–@ψό…@@sψό‘@@yψύΫ‘bψό…@@QψόŠ@@hψό‘@@yψΟ@αψό§@@Wψό‘@@yψΥ@ΫψϋΚ@@EμψόμΥΟΥ ψό‘@@yψϋΈ@@EμψϋςK@@³ψό§@@Q ψό‘@@y ψώζΚψϋμ\@@bψϋ…@@\ςψϋς\@@Š ψό‘@@y ψόb@@αψώΚ\@ΎψϊαK@@nζψϊμs@@Eα ψό‘@@y ψφ@@hμψψsbK@ŠψΎ@ϊEssE@Έψ–Šόh@@WŠΥψωμW@@K‘@ώK­ψώΚQ@ώQΔψQ@Έψώαb@ϋE\y³ς ψφς³sQ@@Kn³ςψQ@ΈψόΎ\K ψϋ@KbŠΟ#ψμ‘Ϋψ@ώyμ8ψώb@h:ψώζy@­;ψόn@@Wψχμ§sQ@EWyΎ ψ­@Ύ ψόϊ\EψϋΔ@@bζψώ­E@ώ\Ϋψ­@Ύ ψώς@ψώςΫψŠ@ϋQyŠ…b@ώKΫψΟŠόK@@Ύ ψϊ@@Es‘ ψΈ@‘ψϋΟQ@@b ψόb@@Ύ ψϋΥ@@QαψϋςW@@–ψΚ@Ύ ψόb@@Ύ ψό§@@‘ψϋΎ@@KμψόbEW‘ ψόb@@Ύ ψό@@­ψύh–Ο ψό…@@sψόb@@Ύ ψω‘@@bςψψ@ύQŠαψόh@@–ψόb@@Ύ ψΥ@ύW­ζ@–ψόQ@@­ψόb@@Ύ ψ–@όςΔ…E@ψόK@@Έψόb@@Ύ ψώΈQ@ψώζh@ΟψόK@@³ψόb@@ΎψύΔ…QψϋμQ@@ŠψόQ@@­ψόb@@ΎψόŠ@@hψόh@@ψόb@@Ύψό–@@bψό…@@sψόαΟΟα ψόb@@Ύψόs@@sψϋΎ@@Eμψόh@@Š ψόb@@Ύ ψΫψΚ@§ψϋςQ@@ψΟ@Κ ψόb@@Ύ ψόΫE@hψως§E@@Kμψ³@‘ψϋΟQ@@n ψόb@@Ύ ψό\@@‘ψώn\@ώEΔψ…@ϋQ…–Šh@ώWζψαŠόK@@nŠώςψΔ@ύWЧ@ώ\Οψώ‘E@ώnζψΟ@ώEςψώΎK@όKbŠΚ ψχα–hK@@WΚψΟ@ώEςψϋμ§sWE ψϋEQn§ζ#ψΟ‘ψ@ώE§9ψώyW@§:ψϊΚW@@Eα:ψϋαE@@ψχېbK@E\ŠΥ ψn@ώEς ψόΈyWEψό…@K…ψώμy@ώ…ςψn@ώEς ψώΫ\@ψζψώμ\@ϋ\…ŠyQ@ώnςψ­Šϋ@@Eς ψωμQ@@Q…§ ψϋy@@QΚψ‘@‘ ψϋΫ@@Eς ψϋ–@@yςψΚ@ΟψϋŠ@@Kμ ψϋΫ@@Eς ψόb@@Ϋψό@@yψϋΫEK\Ο ψϋΫ@@Eς ψόW@@ζψύy­α ψόK@@ΈψϋΫ@@Eς ψόb@@–ψ@ύb­ςψα@ΥψϋΫ@@Eς ψ–@ύnΎς@ώQΚψΟ@ζψϋΫ@@Eς ψώςb@ύα³h@ώEΚψΔ@μψϋΫ@@Eς ψύςŠE@ψϋΚK@@\ψΔ@μψϋΫ@@Eς ψόμ³sEψΔ@ΚψΟ@ζψϋΫ@@EςψόQ@@§ψα@ΟψϋΫ@@Eςψό\@@‘ψόQ@@³ψόΥΟΟμ ψϋΫ@@EςψϋμE@@³ψό@@sψα@Κ ψϋΫ@@Eς ψύςΟμψŠ@αψΚ@Οψϋ@@Qς ψϋΫ@@Eς ψό‘@@§ψώα@yψϋs@@QΚψ§@­ ψϋΫ@@Eς ψϋΥ@@KΟψώhQ@ώ\μψώζW@ϋbŠ–…Q@ψΎŠ@…гψ…@ύn–§@ώμψώζs@–ψŠ@sψŠ@ϋEQn‘α ψχΚ…\E@Eb–αψŠ@sψϋېhQE ψψ@όQn‘ζ ψφՊbK@EWs³ς ψχΎyWE@Kh‘ζ ψϋ@@§ψ@ώE³ ψŠ@ώWΥψώΫ\@ώE§ψχΈ@@yψ§§b@Ύψ@φs–­‘ŠW@@KαψφΥK@@Ey‘§ŠQ@–ψόΥ@@Wψϋ³@@WςψϋαE@KΥψό…@@ψϊς\@@\αψώς…@ΟψϋμE@EαψόsQhαψό³@@ŠψόςQWyψϋ³@@EΫψόb@@sψόQ@@yψό§@@–ψόh@@ψϋΈ@@Eμψb@ψϋ³@@WμψϋμE@@ΎψϋμE@@Δψn@ψωαE@@Q‘α ψΟ@αψό\@@§ψψn@@QKy³ζ ψ­@όW…ΎμψϋΎ@@Eςψόn@@ψόn@@@ώ\­ ψώΎW@ώnΔψόΈ@@K ψόs@@…ψόn@@‘@ώ\α ψύʊW@ώyςψόΈ@@K ψόs@@…ψψn@@­μΎ…Q@ώWμ ψόα³yE@yψϋΎ@@Eςψόn@@ψόn@@­ψϋ­E@@§ψώμ…@ΥψΟ@αψόW@@­ψόn@@­ψό‘@@yψόn@@­ψϋμE@@ΎψϋμE@@Κψόn@@­ψόΚ@@sψώΫΥψό–@@§ψόn@@ψϋ³@@Kςψόn@@­ψό­@@ψόζK@\ψόy@@ΔψϋΈ@@EΫψϋς\@@…ψόn@@­ψϋΥK@@Οψόh@@Šψϋ³@@Qςψϋb@@\αψϊςy@@Kαψψn@@­­§–n@…ψυΟE@@WЧ­§Š\@ΈψφΫK@@E§§ŠQ@Έψόn@@­@ψώΔK@ώKΈψώΫ\@ώQΎ ψφn@@­@@Kh–α ψυς­sWE@@Qs­μ ψχΈyQ@@Qn­ς ψόn@@­ ψψϋ@EWyΈ ψχΎyWE@E\…Ο ψφμ§nK@@QyΈς ψϋW@@αψ@ώ\Ϋψώαb@ώyμψώ³E@ώWΟψσy@@Έψ­‘…Q@@Qζψςς\@@K‘­‘E@@nψ§@φQЧ‘yE@@EΟψό–@@ψϋςy@@Šψϋ­@@nςψϋζ\@@ΎψΟ@ώ…ςψϊα\@@\ςψϋΈ@@sΈψόζKW…ψόs@@ΟψόΎE\§ψόn@@hψϋΥE@@ΈψϋΟ@@\\ψόb@@Υψα@Ύψόy@@sψΫ@ψόn@@…ψϋΈ@@Kςψϋ³@@Kςψζ@Kψ§@ύhΈμ ψό@@hψΥ@αψζ@ϋ…WŠΔς ψn@ύh–Ο ψό@@yψζ@Οψζ@Ύ@ώsΟ ψύς–E@ύKŠαψόs@@…ψμ@Κψζ@Ϋ@… ψόμ³yK@ώE­ψόs@@…ψμ@Κψζ@ϋζΫ­sE@Š ψύΟ‘h@Έψό@@yψζ@Οψζ@ζψώζy@αψϋΥb@@Wψό@@hψΥ@αψζ@ζψόb@@ΎψϋζE@@ζψϋΈ@@Kςψό³@@Qψζ@ζψό…@@ΈψύςΟζψό\@@αψϋζE@@Ύψόs@@ψζ@ζψόh@@Οψό³@@ψϋμE@Kςψόs@@bψΟ@Κψζ@ζψό§@@WψϋαE@EΔψϋςy@@ψϊΥE@@…ςψϋΫW@@nψζ@ϋζ­§ŠW@Δψ–@υh§­‘K@@Qζψ§@ϋQ­‘y@ώQζψζ@ζ@ώKΎψ– @ώbΫψώ³E@ώhαψζ@ωζ@@Qs³ς ψφα–hQE@EWΔ ψχμ‘hK@EWΔ ψζ@ζ ψψϋ@KbŠΥ ψφμ§nQ@@Kh–ζ ψχՊ\E@E\…Ο ψϊΟ@@bψψ@ώςψώΎK@ώE§ψώς…@ώyμψσςE@Eςψ§–yE@@ψΚ@ϊ\§§–h@­ψώςn@ϋb–§–h@ώbςψϋ\@@ΥαψϋαQ@@Κψόh@@§ψϋΔ@@Kμψϋ@@EΈψϋΎE@@ψϋs@@Έyψό³Kb³ψόμE@QψόKhΥψϋζE@@§ψϋ‘@@EμψϋŠ@@s@ ψόα@@\ψϋ§@@KςψϋμE@@³ψ‘@ ψμ@Δψόs@@ψόs@@…ψ­@yψh@ώ…Ο ψόW@@§ψό–@@hψ­@όΚh‘Υ ψώΫK@όEs­αψϋςE@@Ύψό­@@Wψϋ­@@Eς@ύKζ ψώαs@ύ\§ςψϋμE@@ΔψόΈ@@Qψϋ­@@bψ@ώEΈ ψύα‘h@ώWΥψϋμE@@Δψό³@@Qψψ­@@nψΟ–b@Κ ψό쾊Q@ώQζψϋςE@@Ύψό­@@Wψό­@@nψϋΟW@@hψϋΈE@@ψόW@@§ψό–@@hψό­@@nψϋΫ@@Eςψό³@@nψόy@@ψόs@@Šψό­@@nψόK@EμψώμΚψόΥ@@hψϋ­@@KςψϋζE@@Ύψό­@@nψόζ@@Wψόs@@ΥψόΈ@@ψϋμK@@‘ψϋ–@@Qςψό­@@nψϋμn@@ψϋ§@@bζψϋΫQ@@Δψϋ–@@EΈψ³@­ψσ­@@nψ­‘K@@Wμψυςb@@Ey‘­­–s@yψώςn@ϋh‘­–b@ψϋ­@@nψ@ώhαψώζh @ώ…ςψώς@ ψφ­@@nψ@E\…Κ ψφΔ…\K@@KbΫ ψχՊ\E@EbΫ ψό­@@n ψψύΚyQ@§ψχΔ\E@E\…Δ$ψ@§ψώμn@ώnζ!ψ­@§ψςh@@K‘­‘K@@bςψεfφK@Q‘αςψμΥαψϋΈ@@bμψϋμb@@­ψεfύ@hμ ψό@@ΎψόΟE\‘ψώ꓏ώWμ ψόs@@Κ+ψΈψό@@y+ψςψΈ@ύb³μ9ψy@ύb–Κ7ψώ‘K@ύEΫ5ψόςΈK@‘8ψύΥ‘h@­ψώ꓏ψϊΫh@@QςψεfψϋμK@@ΥψεfψώΥαψόh@@Υ.ψόΎ@@…ψϋςQ@Eμ.ψϋζK@@Έψϋς…@@s0ψ§@υb§­‘…Q@@KΫ1ψ§ @ώWΥ3ψφζ‘nQE@EWyΎ $ψψύ­hE@αψφς­sQ@@Kh–α#ψώμb@αψώΚQ@–"ψn@αψφΥE@@WЧ§–n@‘ψΈf@ψhΈζψςαΚςψόy@@ψϋΚE@EζψΈfώ@– ψϋςK@KςψόKbΚψΏ… ψόμ@@Q,ψμ ψϋςE@@Έ;ψy@ώΚ9ψώαQ@όEs§Ϋ6ψώζy@ύW‘ς5ψύα§n@ώQΟ7ψόςĐW@ώKαψΏψϋΎK@@…ψΈfψόΎ@@\ψΈfψώμΚψόα@@W/ψό@@ΔψόΚ@@s/ψϋΈ@@Wαψϋα\@@³0ψςn@@Es–§­–sE@@n1ψώμs @ώyμ3ψφϊbK@@KbŠΥ $ψψόζWE@hψφېbK@EQs­ς#ψώΚK@hψ–@ώQΚ"ψK@hψ‘@φn–§‘Š\@@EΥψ…f@ω…ΟμψμΫΟψϋμK@EΚψό–@@nψ…fώKΚ ψόΔ@@ψόWQnςψ₯Δ ψό³@@…;ψϋΎ@@Qα:ψωμK@@K‘Ϋ9ψΈ@όQ…Έμ6ψώΚ\@ώhΎ6ψύϐ\@ώnμ7ψόζ³E@nψ₯ψώς@Δψ…fψό@@–ψ…fψώαΥψό§@@.ψϋμQ@Qςψό…@@³/ψϋs@@ςψϋΎE@Eζ/ψυΫK@@Q…‘­§b@§1ψώΟQ@ώE­3ψυς³yWE@@Qn§ζ $ψ'ψόΕΊΊΝψό½ΊΊΣ ψώιέ'ψόΗΊΊΡψόΑΊΊΪ ψώυέ'ψόΛΊΊΥψόΕΊΊή ψλ'ψόΟΊΊΪψόΙΊΊβ3ψόΣΊΊήψόΛΊΊζ3ψόΧΊΊδψόΟΊΊθ ψ fΕψόάΊΊζψόΣΊΊμ ψ fΕψόΰΊΊκψόΧΊΊπ ψ ΨψόμΣΣςψόθΡΣφŒψ Ψ3ψ fΕ3ψ fΕ ΄ψ&ψΦ!΄ψΒ!Θ ψώ†.&ψγ!ΒψΘ!Φ ψώή.&ψϋρ'!!ΟψΦ!έ ψ“'ψό'!!Φψγ!κ3ψό5!!γψόρ'!'4ψόB!'ρψύ'!5 ψ fώjσψύP!.ψύ5!B ψ fώjσψύ]!;ψύB!P ψ ώ“σψύ§q“ψύ™q ψ ώ“σ3ψ fώjσ3ψ fώjσ ΄ψ&ψϋ“!!'ρψόq!!; ψώ’D&ψό !!.ψό!!B ψώαD&ψό!!;ψό“!!P ψž&ψό»!!Iψό !!]3ψόΒ!!Vψό!!j3ψόΟ!!dψό»!!x ψ fψόέ!!qψόΘ!!… ψ fψόκ!!ψόΟ!!™ ψ ³ψύxq»ψόκxqȍψ ³4ψ f4ψ f ΅ψώίυψξέγψδέοψόυίέιψόΕΊΊΝψό½ΊΊΣ ψύέβφψώφβέόςψψςέώβφψϋφβέέυψόΗΊΊΡψόΑΊΊΪ ψέϋΰνρπβέϋάΟψψάέψβπρνΰέέλ ψόΛΊΊΥψόΕΊΊή ψηέψΫ™ΧθΜΡάέη ψόΟΊΊΪψόΙΊΊβ ψώςδέπαδέέΆ™™§ΜΜΣέέδαέώδς ψόΣΊΊήψόΛΊΊζψϊςσψψςΝ™±ΜϊΩσψψσςψόΧΊΊδψόΟΊΊθψϋΈ™™ΙΜΪψόάΊΊζψόΣΊΊμψφ띙·ΙΙΜΜΞςψόΰΊΊκψόΧΊΊπψψΡ‘ΎœœΏΜζψόμΣΣςψόθΡΣφψϊΓ³™™³Ε8ψψμΜşŸΓ έ7ψΣΜό­™¨χ5ψζΜ½™Ρ4ψώυΠΜώΟ₯™ώ‘ς3ψαΜώθΧ™Ε2ψώρΝΜόΫψψΊ™ώ›μ1ψΨΜϊΡυψψρ£™Ί0ψμΜκψΪ™γ/ψΣΜΫψΊ™ώχ-ψζΜώΡυψώρ£™Ρ,ψώυΠΜλψέ™ώ‘ς+ψαΜέ ψΏ™Ε*ψϊςΝΜΜφ ψϊτ¦™™›μ)ψΫΜν ψα™Ί)ψόάΜΜΰ ψόΓ™™Ύ)ψόμΜχ ψόυ¦™ί*ψώεξψώγΠ hψώ;ήψ¬.`ψ`.Έψόή;.†ψΦ!΄ψΒ!Θ ψύ.TλψώλT.όΕψψΕ.ώTλψϋλT..ήψγ!ΒψΘ!Φ ψ.ϋG¬ΕΉT.ϋψψ‚/.ψTΉΕ¬G..“ψϋρ'!!ΟψΦ!έ ψy.ψ0‚ͺέμΦ 1.y ψό'!!Φψγ!κ ψώΕ`.πG`..tͺͺ΅ΫΦ֍..`G.ώ`Ε ψό5!!γψόρ'!'ψϊΕΡψψΕLͺΎΦϊVΡψψΡΕψόB!'ρψύ'!5ψϋ°ͺͺ­ΣΦΟψύP!.ψύ5!Bψφν­ͺΔΣΣΦΦΧτψύ]!;ψύB!PψψΨ±Κ­­ΛΦκψύ§q“ψύ™q ψϊΞΐͺͺΐΠ8ψψοΦΠ――Ν°β7ψΫΦό»ͺ·χ5ψκΦΙͺΨ4ψώφΩΦώΨ΄ͺώ±σ3ψζΦώμέͺΞ2ψώςΧΦόβψψΕͺώ¬ξ1ψίΦϊΪυψψς²ͺΕ0ψοΦνψίͺζ/ψΫΦβψΕͺώ»χ-ψκΦώΪυψώς²ͺΨ,ψώφΩΦξψβͺώ±σ+ψζΦγ ψΙͺΞ*ψϊσΧΦΦΪχ ψϊτ΄ͺͺ¬ξ)ψβΦπ ψεͺΕ)ψόγΦΦε ψόΝͺͺΘ)ψόοΦΪχ ψόυ΄ͺδ*ψώκπψώηΧ hψώOαψ΄DqψqDΏψόαOD’ψϋ“!!'ρψόq!!; ψύDfμψώμfDόΛψψΛDώfμψϋμfDDαψό !!.ψό!!B ψDϋZ΄ΛΐfDϊEŽψψEDψfΐΛ΄ZDDžψό!!;ψό“!!P ψ‡DψE΅ΰξέ¬FD‡ ψό»!!Iψό !!]ψώΛqDπZqDDƒ΅΅ΏαέݚDDqZDώqΛ ψόΒ!!Vψό!!jψϊΛΦψψΛ^΅ΗέϊhΦψψΦΛ ψόΟ!!dψό»!!xψϋΉ΅΅ΈΫέΥψόέ!!qψόΘ!!…ψφοΈ΅ΝΫΫέέήυψόκ!!ψόΟ!!™ψψέΌ··ένψύxq»ψόκxqΘψϊΦΙ΅΅ΙΨ8ψψρέΨΊΊΦ»ε7ψαέόΕ΅ΐχ5ψνέΡ΅έ4ψώφίέώίΎ΅ώ»τ3ψκέώξΰ΅Τ2ψτέόζψψΜ΅ώ·ο1ψδέϊΰφψψσΌ΅Μ0ψρέοψγ΅ι/ψαέζψΜ΅ώΔχ-ψνέώΰφψώσΌ΅έ,ψώφίέπψε΅ώ»τ+ψκέθ ψΠ΅Τ*ψτέώΰχ ψϊυΎ΅΅·ο)ψζέρ ψθ΅Μ)ψόηέέι ψόΣ΅΅Ο)ψόρέΰχ ψόφΎ΅η*ψώνςψώιά hψ €ψ €ψ €ψ €ψψψψψψψψψψψψψψψψψψψψψΘψΘψΘψΘω‚|A> enum_tools-0.12.0/doc-source/000077500000000000000000000000001460302440600160205ustar00rootroot00000000000000enum_tools-0.12.0/doc-source/404.rst000066400000000000000000000003271460302440600170630ustar00rootroot00000000000000:orphan: =============== 404 =============== We looked everywhere but we couldn't find that page! .. image:: not-found.png :align: center Try using the links in the sidebar to find what you are looking for. enum_tools-0.12.0/doc-source/Source.rst000066400000000000000000000025551460302440600200210ustar00rootroot00000000000000========================= Downloading source code ========================= The ``enum_tools`` source code is available on GitHub, and can be accessed from the following URL: https://github.com/domdfcoding/enum_tools If you have ``git`` installed, you can clone the repository with the following command: .. prompt:: bash git clone https://github.com/domdfcoding/enum_tools .. parsed-literal:: Cloning into 'enum_tools'... remote: Enumerating objects: 47, done. remote: Counting objects: 100% (47/47), done. remote: Compressing objects: 100% (41/41), done. remote: Total 173 (delta 16), reused 17 (delta 6), pack-reused 126 Receiving objects: 100% (173/173), 126.56 KiB | 678.00 KiB/s, done. Resolving deltas: 100% (66/66), done. | Alternatively, the code can be downloaded in a 'zip' file by clicking: | :guilabel:`Clone or download` --> :guilabel:`Download Zip` .. figure:: git_download.png :alt: Downloading a 'zip' file of the source code. Downloading a 'zip' file of the source code Building from source ----------------------- The recommended way to build ``enum_tools`` is to use `tox `_: .. prompt:: bash tox -e build The source and wheel distributions will be in the directory ``dist``. If you wish, you may also use `pep517.build `_ or another :pep:`517`-compatible build tool. enum_tools-0.12.0/doc-source/_static/000077500000000000000000000000001460302440600174465ustar00rootroot00000000000000enum_tools-0.12.0/doc-source/_static/style.css000066400000000000000000000000371460302440600213200ustar00rootroot00000000000000p { margin-bottom: 12px; } enum_tools-0.12.0/doc-source/_templates/000077500000000000000000000000001460302440600201555ustar00rootroot00000000000000enum_tools-0.12.0/doc-source/_templates/layout.html000066400000000000000000000003441460302440600223610ustar00rootroot00000000000000 {% extends "!layout.html" %} {% block extrahead %} {% endblock %} enum_tools-0.12.0/doc-source/api/000077500000000000000000000000001460302440600165715ustar00rootroot00000000000000enum_tools-0.12.0/doc-source/api/autoenum.rst000066400000000000000000000062371460302440600211700ustar00rootroot00000000000000================================================ :mod:`enum_tools.autoenum` -- Sphinx Extension ================================================ A Sphinx directive for documenting :class:`Enums ` in Python. Provides the :rst:dir:`autoenum` directive for documenting :class:`Enums `, and :rst:dir:`autoflag` for documenting :class:`Flags `. These behaves much like :rst:dir:`autoclass` and :rst:dir:`autofunction`. .. extras-require:: sphinx :pyproject: :scope: extension / module .. extensions:: enum_tools.autoenum .. contents:: Sections :depth: 1 :local: :backlinks: none Usage --------- .. rst:directive:: autoenum autoflag These directives are used for documenting :class:`Enums ` and :class:`Flags ` respectively. They support the same options as :rst:dir:`autoclass`, but with a few changes to the behaviour: * Enum members are always shown regardless of whether they are documented or not. * Enum members are grouped separately from methods. The docstrings of the Enum members are taken from their ``__doc__`` attributes. This can be set during initialisation of the enum (see an example `here `_), with the :class:`~enum_tools.documentation.DocumentedEnum` class, or with the :func:`~enum_tools.documentation.document_enum` decorator. See the `autodoc module documentation`_ for further details of the general :rst:dir:`autoclass` behaviour. .. _autodoc module documentation: https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html .. rst:role:: py:enum:mem py:enum:member py:flag:mem py:flag:member These roles provide cross-references to Enum/Flag members. .. versionadded:: 0.4.0 Unlike a standard ``:class:`` or ``:enum:`` xref the default behaviour of the ``~`` prefix is to show both the Enum's name and the member's name. For example: .. rest-example:: :py:enum:mem:`~enum_tools.demo.StatusFlags.Running` The original behaviour can be restored by using the ``+`` prefix: .. rest-example:: :py:enum:mem:`+enum_tools.demo.StatusFlags.Running` .. latex:vspace:: 10px Demo ---------- **These two have been created with** ``automodule``. .. container:: rest-example .. code-block:: rest .. automodule:: enum_tools.demo :members: .. automodule:: enum_tools.demo :members: :exclude-members: NoMemberDoc,StatusFlags,People :noindex: :no-autosummary: .. latex:clearpage:: .. automodule:: enum_tools.demo :members: :exclude-members: NoMemberDoc,StatusFlags,NoMethods :noindex: :no-autosummary: .. raw:: html

.. latex:vspace:: 10px **This one has been created with** ``autoenum``. .. rest-example:: .. autoenum:: enum_tools.demo.People :members: .. latex:clearpage:: **If members don't have their own docstrings no docstring is shown:** .. rest-example:: .. autoenum:: enum_tools.demo.NoMemberDoc :members: .. latex:vspace:: 10px **Flags can also be documented:** .. rest-example:: .. autoflag:: enum_tools.demo.StatusFlags :members: API Reference --------------- .. automodule:: enum_tools.autoenum :no-docstring: :exclude-members: innernodeclass enum_tools-0.12.0/doc-source/api/custom_enums.rst000066400000000000000000000002571460302440600220500ustar00rootroot00000000000000=================================== :mod:`enum_tools.custom_enums` =================================== .. autosummary-widths:: 30/100 .. automodule:: enum_tools.custom_enums enum_tools-0.12.0/doc-source/api/documentation.rst000066400000000000000000000020141460302440600221710ustar00rootroot00000000000000=================================== :mod:`enum_tools.documentation` =================================== .. module:: enum_tools.documentation .. autosummary-widths:: 35/100 Core Functionality -------------------- .. automodule:: enum_tools.documentation :noindex: :no-members: :autosummary-members: DocumentedEnum,document_enum,document_member .. autoenum:: enum_tools.documentation.DocumentedEnum .. autodecorator:: enum_tools.documentation.document_enum .. autofunction:: enum_tools.documentation.document_member .. latex:clearpage:: Utilities -------------------- .. automodulesumm:: enum_tools.documentation :autosummary-exclude-members: DocumentedEnum,document_enum,document_member .. autofunction:: enum_tools.documentation.get_base_indent .. autofunction:: enum_tools.documentation.get_dedented_line .. autofunction:: enum_tools.documentation.get_tokens .. autofunction:: enum_tools.documentation.parse_tokens Warnings -------------------- .. autoexception:: enum_tools.documentation.MultipleDocstringsWarning enum_tools-0.12.0/doc-source/api/utils.rst000066400000000000000000000002151460302440600204610ustar00rootroot00000000000000========================= :mod:`enum_tools.utils` ========================= .. autosummary-widths:: 35/100 .. automodule:: enum_tools.utils enum_tools-0.12.0/doc-source/conf.py000066400000000000000000000050171460302440600173220ustar00rootroot00000000000000#!/usr/bin/env python3 # This file is managed by 'repo_helper'. Don't edit it directly. # stdlib import os import re import sys # 3rd party from sphinx_pyproject import SphinxConfig sys.path.append('.') config = SphinxConfig(globalns=globals()) project = config["project"] author = config["author"] documentation_summary = config.description github_url = "https://github.com/{github_username}/{github_repository}".format_map(config) rst_prolog = f""".. |pkgname| replace:: enum_tools .. |pkgname2| replace:: ``enum_tools`` .. |browse_github| replace:: `Browse the GitHub Repository <{github_url}>`__ """ slug = re.sub(r'\W+', '-', project.lower()) release = version = config.version sphinx_builder = os.environ.get("SPHINX_BUILDER", "html").lower() todo_include_todos = int(os.environ.get("SHOW_TODOS", 0)) and sphinx_builder != "latex" intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), "sphinx": ("https://www.sphinx-doc.org/en/stable/", None), } html_theme_options = {"logo_only": False} html_context = { "display_github": True, "github_user": "domdfcoding", "github_repo": "enum_tools", "github_version": "master", "conf_py_path": "/doc-source/", } htmlhelp_basename = slug latex_documents = [("index", f'{slug}.tex', project, author, "manual")] man_pages = [("index", slug, project, [author], 1)] texinfo_documents = [("index", slug, project, author, slug, project, "Miscellaneous")] toctree_plus_types = set(config["toctree_plus_types"]) autodoc_default_options = { "members": None, # Include all members (methods). "special-members": None, "autosummary": None, "show-inheritance": None, "exclude-members": ','.join(config["autodoc_exclude_members"]), } latex_elements = { "printindex": "\\begin{flushleft}\n\\printindex\n\\end{flushleft}", "tableofcontents": "\\pdfbookmark[0]{\\contentsname}{toc}\\sphinxtableofcontents", } def setup(app): # 3rd party from sphinx_toolbox.latex import better_header_layout app.connect("config-inited", lambda app, config: better_header_layout(config)) html_logo = "../enum_tools.png" autosummary_widths_builders = ["latex"] nitpicky = True needspace_amount = "1\\baselineskip" ignore_missing_xrefs = [ "^sphinx.ext.autodoc.(Class|Attribute)?Documenter$", "^enum.EnumMeta$", "^docutils.nodes.Element$", "^sphinx.domains" ] # stdlib from typing import Type # 3rd party import enum_tools.autoenum from sphinx.ext.autodoc.directive import DocumenterBridge enum_tools.autoenum.DocumenterBridge = DocumenterBridge enum_tools.autoenum.Type = Type enum_tools-0.12.0/doc-source/contributing.rst000066400000000000000000000024271460302440600212660ustar00rootroot00000000000000============== Contributing ============== .. This file based on https://github.com/PyGithub/PyGithub/blob/master/CONTRIBUTING.md ``enum_tools`` uses `tox `_ to automate testing and packaging, and `pre-commit `_ to maintain code quality. Install ``pre-commit`` with ``pip`` and install the git hook: .. prompt:: bash python -m pip install pre-commit pre-commit install Coding style -------------- `formate `_ is used for code formatting. It can be run manually via ``pre-commit``: .. prompt:: bash pre-commit run formate -a Or, to run the complete autoformatting suite: .. prompt:: bash pre-commit run -a Automated tests ------------------- Tests are run with ``tox`` and ``pytest``. To run tests for a specific Python version, such as Python 3.6: .. prompt:: bash tox -e py36 To run tests for all Python versions, simply run: .. prompt:: bash tox Type Annotations ------------------- Type annotations are checked using ``mypy``. Run ``mypy`` using ``tox``: .. prompt:: bash tox -e mypy Build documentation locally ------------------------------ The documentation is powered by Sphinx. A local copy of the documentation can be built with ``tox``: .. prompt:: bash tox -e docs enum_tools-0.12.0/doc-source/docutils.conf000066400000000000000000000000501460302440600205100ustar00rootroot00000000000000[restructuredtext parser] tab_width = 4 enum_tools-0.12.0/doc-source/git_download.png000066400000000000000000000765131460302440600212140ustar00rootroot00000000000000‰PNG  IHDRͺnΖv­sBITΫαOΰtEXtSoftwareShutterc‚Π IDATxΪμy\SGϋφ―€žˆ%±%‘bβc•M!Ό²U‘βΎ[₯U°j΅Zk]«­χ}mmk΅Φͺ­‚kέwάX¬€ώX!΄΄&bI°&TΝ±šχ q½ΏO?>αdΜ9χΜ™λž{ζL8z½AAΌJؐ ‚ ‚δŸ ‚ ’‚ ‚ Hώ ‚ ‚ ω'‚ ‚δŸ ‚ ’‚ ‚ Hώ ‚ ‚ ω'‚ ‚δŸ ‚ ’‚ ‚ Hώ ‚ ‚¨υͺMqϋο‚•Z§Σ‘±^1τ‡¬@ΌRp££ ρ›Ž¦ξΔζνρ»ω·ΘtΔsBS'ρ{aΖΎ]mJNΥΏψw-χΊNχΐΡΡΡήώ5[[[²μ«Cζ•+ή­[“^œϊϊέ»u+²CmxτθQQΡΏω·o7lΨ°ΉΛ[Υ¦υΝ€ΣWm3ϋzœzTθK9δ?u7>«(έŽώ?½ΎθΏG ]˜OΘΖρ«k>ϊΏύwNχΐΕΕ™„Ÿ ˆ—[[ΫFψφφ―ύy-χφίUΗ~8υΛ髉ΆΝrl‘η@ΟΡs jo"ωτcκΔΣς θQ6κqμλΕg$όpκ—» ­‘ό¨Τί|ΣΖΦ–ρ«Ωœ¨ή_ΐ€¨-6ΆΆNίώϋοͺελɝΆN κNe£|ύOiτoτ<9ƎΐF_―)76~OΝε_§Σ½fY™ ˆWŠΧμ_{pγA ιίώϋ6ΌplŠϋ]G_2τη”ν• ’N~½ρ_`˜Νηp8zϋz y~ΥηΧ«:s[[SΠπŸ ϊz₯°΅±εT©άΆ›‡«Οppl8zθυΕc}Nω1AΤ½I3Σ†Ε'6Ξcθλ9 ‡}ΜΦBώ©G!I!H©ρWΡΫpτ6ΰ°εΠsΚH>‡τŸx: TŽυzpΐΡ?ΎΧ£ξ„ Ϊ§ϊ"j$ώ0j±ΐ©€ κ|τohiC€Γy¬ΧΫXΤ‚λ‘ ‚ jr8z=`[ΰ”_μGκOΤ‘‡Zne©^ΟΡόQι9¬;%ω'‚¨a„ τ]?ŽιδO§–k‹zCH€Γώ Œώ)žψ*7-ͺύΆ7 žΚπί03Θι+dβ©΄>ŽΙ£―7zz}qƒ¬όSOκOP}‘+Uΐ1ιIϋ‰gβ p8F €MZΠ‚ι'‚ j>ϊ'ˆ΄q‹Υ>ΥQσρ?AΌ PπŸ ώΔŸ ΖOόSBPνS}“Sζ ΙβΒ1μωkΨ}šSvW€šΘ­PeΨςΛΑ i²[Z–ŠœEn~ƒ>ˆξκΞ£z² όψ’/Ώ>+»UϋžkΞΟΞXΩmxœpώdΧώœν±»NΏΐ‚ιΈτ܊άη’ΠΩ_Όω:€vsN―λmRΧ²•έ"γ”ΪΖ$|Ϋ‹oQfOλ•±C{ΚΎ?=Σο₯© KΘXΡ{ΨφJ«ΎέœΣλz3§'wžt–ΪΜ;·Ύ―Œl}I^T›ސ΄Υ" ΠΑ‰oΛͺŠn( ₯q™qG -NπZχπ]«Δ %Mή>ϋΘ£—΄“³ο7pœ/P ›rAϊŒ ρ΄Lύ\άμSΥΩωγgξΞ)Ωp˜Uζ]Qζ]I;±gΣ€ΩίΝμ$¬γ»˜2ηΐ„LZϊb>ͺ fΚ4˜ΥιΘ’Ί ^μΪΝ Ÿ5ā)ώ›7ς7ς tιυ‘lΩ‡’Ud"β™Λ £‰:ΩW%ΪΟ4ρnηη.²g•—“Ξζ¨Q$Ϋ3s’σΆŸίw~jwψ’D•Wδ,ˆ|ΏuBk! ηΉyϋ΅"£/{kuχ­}žϊZWJή {ΦuQwυUrŠσ;“ίχgΚ}+ςfτΰ Όύό΅:0ή‚'tkϊ'T’Ίnu‚mσΙ%Ϊ(?]!Ν.*βΪKΪ7kα{OχYίά3δκ_€LΔ 9ϊW\΅Ν ύMΒ—|3»«‹1*§M[9l|\Λfnή’4pv0WΉ-ΊΟςLΐΎηΖΓΡͺ―}Ό(β‡mŸΊ€Nyφϋ―c“3sδZΘΕΝ§Sήλ$*οιδgbΏί~(3ο–JΛπ"žŒι,ͺ*X]že†{Ηfϊ“ ΰ…Ο\읹vˁ΄LΉ–ηβέφƒ©“Kξ¨Κ<•»’ϋ,Μ˜ŽKŒ‘ΙK1αPLΗΥηV„rν‰Iα3Ο°€ίŒS? 0‰ˆhΟ,œπ}ržΪIYόqŽίGί|ͺΝΙΌtY 8·cŸΔ=>[ςΆ}<σ€υŸχ οΐΪΨ€΄<­ΠΩΗ―ηψTaV&ύτΓΆ³™2ω-–ΫΔΩΝΝ'"ς£ήή&gXΠ6T—6­ΨpόRŽ’Ήϋχόh@—«»ΊΠ©}Σήδ₯J žΘΩέ―ηGcψŸIu0.ύ…šm(ZeΪ₯΄K,ή@ƊGΓ#Χ¬$/dϋ·mΠώ’3“O.;rχ‘α8ΟiμŽπΆŒ―χφ²ε‰ζCЍΫ{GE7στhδΔ}”Ÿ[xM*ίϋ͟YZγ·otoΏψC€=;η\–ΔoH?'OW¦(· υ‡”οJ.€±o7ήo@ˆcsW†Uά½&½qπ›«ΙŠͺ‚ήU_·qTm_8μρ¨έqBΏ‰S\^;|μ£U…f#’£Ί;5?ΚΟΞ?ρΜΪΛ5άcΫ\G˜κ%‹―μg·ς―‡E;–νΟμΎΜ€Cο91]™’x~~ϊΞ…ε—X@™§Π»οQν±…cvŸ(ή‚^=΄ΙK†MΩ›gμW‹ς2/δe^8sζ㍒ݹ ά=!jρεβš`Υ·rΤW₯%_Z²}yW‘φΐ谘KΖ―ΞL πuŽΪ±gΌ¨Ί<Λu#jyŽ,`t £έ2œV$»°wF΄{–w¨ΊœMόύήBζu°9i2}Wo@™)3h›“&Σ‡zςK2άΫΆ–±³^›wEv«δφΛΤΥΣύυΠ—πXf7+‡?zλkΏlλΡλΝ¦τz@§ΜΛ‘έΤ{bFa΄LΡ•3yW’.ε}·y²?oͺ >™V:©Tt=σΒυΜ 'ωyeOͺmω‘qcζ%ˆœ΄ƒ«Ζ%;pΝ–Ή.λBu|ζΰ/Ξ©‹ORη]IΞ»’|φBi9k2όΧΧδ¬jͺ»ά­YτhXiδš•€Ϋ]τ·Γά%\(ό5q™©όhσ·”|αΔNφHΌ[Q8ύη„Ο3™2hζ+nζ+νήlِΣ'ΐ΅πt1szDyΪRΪ{Š{­κα€_gΉ<ρ§;:χr΅5ζβκθΰκΦlcΤ±Έl³@υΧ-ΑΎ{Ϋ•C\€ζοΎΡ;?tύ,ΔΞπG‹ΐ-~ꬻάν”όplΫζ8RΨ{zΨΓ*ˆ/IχN=FφτΊ ΛημΝc&§­ίyδΰ/«#[σν•o§oΘέΩ―Φ^Φhςφs–m\Ώlζ€– υΉŸN(πœ[: Œ5Ηkς–»s^΅yV{]ΖΆ8%fɜ#œ >ϋΉm'”@υεtιδ'€[²L%]ζΉ1Σ[2™€R–£€&ώώε¦Bx½7€€―ο/ΈOΩ—~ιϋAΥJBορΩ’ώC¦kΩ{Κ‚ ³yq 6η˜ˆ―4N* ό†Μ[»ξΫE‡6a¨Ο.YpPmIΫ”»/IV`D>ž·hΑΜ­ΉκBm₯ε«£ΊΘό~ε95ΑΫVόΈcσWσ†Ώ- >·|ν…gΡG°Κ³{wνήcϊί±Lu  «\»’Ό@νίΦ3°ΰ~κ―ωε†žΖ'ŽΫ=4lχ”­΅―…§ ςχ|~rΚ¨sO±›MœΣ⍲Wiζi›—²lrβΖΓw “°ΑQ.ΐΦ‹φ½\m’€EΗ>Ϋ=ζγ«W5ίqΤ*ίζζJlΝu™ΰ!.ΘΊq<ξκ‰3²ΪxpΫ‰!vXōŸŸ[0[vUgηΐ·ςrςpςpl €qτt5žλδιπ±Cs1δ§δe‘MjpΛΆν&ϋIψŠR7$ΖD‹™-ϋSΐ.ψCcž–άμsό·ΪV«Uο[ΰΦ€ΊΣ‹Ώ΅ο΄hΫκC‹gV`ڍ‰yϟ ΙԘα—ή]›ƒΌγ‡€ŸLφQ³<ŽQΟBόΧ·νω#Π(Υzˆ:}±ΝΟ{B‡9ΏŒί”]«C‘;3³š<+-Ϋ[¬ύj‚;@§&·ΖμUΚΌ[zˆtΙΥ•Σ­£ΏύήγE]ΚyπžH–™ΓƒZ]˜™σ``›μKy hΣΦ­šir}ΕR…?T[ž &k7dW6Ί+“Ή}Ĝοη†ςD΄h{ΝKfK \ζνΉ]g‹ ΙUk'ϋpψ΅sΓΰίζ€Mή}BΡ+RT]Ϋ€όδK,¦υ€VˆθΨDΧgό‘BKό« νu₯AΡΞ~ήήnBΈyΏe­ΙZΐ™ΡLMΗ5>EvhυΒCeΎjια-¨Όβ*}4jfδZ”€Nڝ`η 4 »ο_SX79<€™=νrτib!~ν7ΚLˆ{¨ψΟ½&ήΨprΖͺΒ‡N5μΪΛ7rn3βˆ0;lBϊ²­ωP€,Αι§)puyGri΄VΧ-:unΜxωJ†ώ‘CœΊ‚ο’NR')l·mlα`έε “RΨ^=x:5gήφtlΞ ξ:Ϊ9x86gdR§fp_šPfφ‘R›ΤΔΤvŒ6?ι ψsΝͺw€άoνήΒΰΫ;·-ΊΩ²ŒχοUEψ&}λ7ι[ŸͺόΧb2Ρς”~₯sΒWrŠ ½ΐζo/™τ3 ›―Θ”π½3sε;€N)»|lwNfζ•ΜKςͺžg>ΟJΞ΄oνW7δŠήjΐ°ςΫ‚<[wςfŽ_`YΩeΌe9·‡v‘ΎΩ{+'G©dζ`Ό;ϊ<‰ΉΙšίγ³ΕΎm―vΕχΒπν–$Ÿeq+G¦BωYpΩΓ\‰σ€ώ₯sι9°υ·‹9W䀨ΊΆ‘ΛΉbψΣ»W§b{pƒ{uΪ«~rχdA]4 5q¨IλΆ‘C{~<ΣεΕy-ΆςGγιωΕnΦΎ]ζΰιa Ή²C’sο+5ΧpπtJe˜ΝJ)4†Ψ’Ώ€#ΐ΅5„ϊ› ή+υ2&ηΫ#βφΥ⺏€Gnά©΄›w0Σ₯&Ÿς0ρΟ€‚½­Ίά£¬ψΆ‡˜α:H<‘εαΰ&^M τλ%vh!Ά½#q° +H’šΉr›ΤΔΤEgηœ> Τ;HΊ»·8zJœ\­½Ω κnpžšφׁόσ<`[Χ•€EOc/4Ρ?Ξψ~•:ο …φ–€Ny|υŒ•{K#‚ cΈf₯qΑκσ¬nΝσδωwrΓ…+ΈuE&ΟΉ$·vmΤφήΚ»$S 2”οNήO€Λ―Ν=>Kx“Ϊηςφ@! ΥV¬NVkΈ ΠΤ`φB!°`΅Z-ΐ«¦mh3BQ©Η Aƒ?±°κλΒoΒ’(圸δ[,PtλΚΙνWNnμέzL[4£·ΛΣ_«ΖtZΏ:ΤΊλV–ΊvFII^˜φΟjΆ€ύΔ¦ΒYύ¬½AΆUχMυΉHuŸΨΪσΛφ€•u†\[Γ°ŒqlΤ’‚Ω‹™Ϊ]χQ‘ͺr·†ΟΨs€-(2qξίVŽΦ]ξί”Bμ{OFΝ€GΧδR‘o/q#‰§}‘―=Vz#«\³OΤυΕ.γVφς΅+ΉwVgςDXt³{u€ύΥΘMΦ~Ω»ω9#9P_8“?ο2_¦­|σj@ΠkΕΆ ήeΧϊ”dΐΪ`“χΆνŸκnTςΈIsφζ°`š΄ιΩ?’Ÿ7NŒΈ:³8+ όͺ κσΤWŠ,-›υy ό:ΊαJς’^Θ+άόܚμ““|PΗx«SΎΊˆ³^o¦εΤΰ«ώ[Mo\\­F«ΧσL55Κ±}}“κ†V­z7γs£Σ¨ WΏμΥυΠ3< ΄*­^/(},ZΓcκWί6μν ή«R©K3QίR—3uέΧ…½ίψoFΛ/;{πΔρ —sΤ,€’œΓ³§άφŒw―A__«•΅}™G΅G£FFAIκΆύΧΕ?φZΚ]„8vaŽH)(σe`ΰχ+]€Β_O΄ͺ \΄ H8<;{ΰN©οkΈλGE:ΛΒ šG†§0ˁ‘‹ -‰R<™λΠ°dνή(ΝΚ±ΠϊΛ©ς“³ΰε‰f!-\ PšUtM|!ΝCZΊΨΈq*NM3”‘Ρ€oΪχς΄…HϊλΥƒGt„nν7ΞΧͺ›΅Μ¨;νGόβŸsDΟΦ άΪ½xUšιy{ΦόC­.TkξΞ•ž/ςv³΅,§Τ‰Χ*332332σ΄€κΉΣiΚW3ί{ΗίYΐζ]–WY¦jσ¬ειάΖΏ €’΄C'ς[k4qw³ “]Phβη„b’uq5)†³ΘJ”8gR)Ϊ΄ƒ—ΥŠʌμŠ.ΈP\:ΥΉέ— ―ŒΊΉU|PάZ»1sπPι4y'fΏuηVί6Έξn{g:«,7¦ΏπdƒΥΦ…Nvθλ΅ί|½vož ηsΎŽ;hύτwš_Ι|Α·}y:F~>ΫuόuδΟ«:pvl Ι7zŽoΡΒΡΞΑ‘Ή“]qι_a–aYΎg‹w°E¨+PP˜%G~VaΰΠΎE€#€"C‚aA„Nνsβ7Γ[BMzFuβι+[%ΖmΫ#Tpς š½τΝβέ’;52σπΚΕ[3‹ΐ΄ž»ω-žqY{iOμžOuξ§UηŠΜ"X­Z,Θ³ͺ‘ˆY³X–gΛv~φΫ© ΖΝ―%ΐΈy»αΠe΅Ί€ΐ―ƒ{₯Έ©I+ŸτΦί£Eγ«»ώΆƒCηͺΑ^Y=ΰBh;7΄ΚΜsg―Σj@―–es.<1gο“!νμ ΟnωφBΈ θηSq[^‡mν/œ+Βυ­γ?ΑΤαΪKΫWnΜd0~ΒEΠ«ͺmΞ=ΈΕ­ΜaΩK«Η‘σ޳φRάΧ{oUwΛOΈ.\Š2nωU Ψ_R±ŸΌγ&`΄%Λύν^Νž΅άόΖΒ{―ώΡ¨©‘k\’ΊkO…l]œϋΚθF ΧaΐΦή’S ©τξa#I—±-(ώŒ;efζ+)NQ̍"ΗβΜd#‰ Œς΅ΐ¦ΘΞX8ΐ*ŽΗίνgΗϊM\΄1ΎbΗw>oιΛ@Wπ]ίΓiλζΊpχD\α€/ΣΈ:Ϊ#ΏΑs0Εέ©F—ϋ3!Ώ(Ί…=ίΞ`³σf\C ‰£€‚όδμšGhͺ/ƒ†eL ϋ€0Vͺ΅kχa`0ίΪ›­.`ϊα™Θ͜ΦSΧ.Π~2λΰuκ?ΞϊγlιwL“Ž“Ύ™βΗ­R@>ωΌGζ‡σΤη9Ώ¨δΈΰν©sϊΉhΫ£­ύε EP_ψnΚ°λ-ϊΊΠj΅† žΘ8Ρxiqχ·χŒ‹έ]Mž5ΉΝΆδΙυnΫ†9tήΰφψ{σέZ6Αε[`οΧ©υ“3{Ϋ'5)†ίΤQyŸlΝ,BΡυί^Ν΄ςίω|Aωύνμο{Ή§δ@λq_DšρB?ι•7λΰuV}aληΆšδϋεά^ΒκΫ†σΐΩŸ³ϊR›wβ»ΟO.iΟ±OΥΥ…ί‡_ΌσΫ”·Šμψ|Μ“3οαQν^°νλΝ„Ÿ†‘ŸΟφ_}l9kρΙόπYύ1°kΡ₯E‹.¦κ|γ»Q)RsVϊ7ώΒ²_Νκ׈qGG–ž"_φωŸΊ₯­Όp\1ΒΥ.xnΧΰΉ%Ηο§.J<(―»λΐ_q‰»tΘ0.£Vͺ„-§Ι­ΊάC©BͺkΜ€ό”‚¨ T@"€’”WkQCΥ—A₯8žΐJB8ŠG}+ΝέvΝσ°έ¬Eΐ3“š&DηlίΡσΠΦΨƒΏeζ©Υ,Σ€I‘s›w†G,ϋΩ :ΕlίώφΪ΅qr+Υΰ5yΛ»]αΡ=½…Πυ\ΌΆhΡΚΈδ5·IKοNΡSF ŽO˜wHδLR΅ ~Ξ‰ΌΎςΰ•Ό"֐5yZf„r,ΙΣή―­7Ξ_`ίΪ­ τάόά™·X€iέΏk‰…υ•)7ͺρ=>ΩΪ·χώxσΑg6oŒ½”£Μ»₯fνΞMœ[χ>Ί‡Ώ[ޘ‚žsΎάpθ’μ:-½ΫEOίQΔ5ƒvœ³}Η;±·Ÿ½’“wKΛmβμμΦ.rΤθNΞ\XΪ6χ!k·7Ω°2ξμ•ξ~ύGGΫο™»5Gˆ«Ju!θ΄θΗΝmγ6ο9'»₯V«YF :·ξ9j`'gO΅ΎͺνVΆ·nΖ7rυΓ:huEQςη>ψ΅Ε¨’FŽΆ¬’(_qWz83nGAε‚z?ωσφ2nEΗ”Ÿ{χZΒΥ­ίάψΛ*§Jucyί©Sόϊ‡84ΫAStCͺ8τCζ ιύΊ½.Άpο¨ωγtql.Davώ‘o2‹·βi U‰ghΩε΄ω©R`³² ρ½BiΦ£b[ΰQVbώΓZUP΅e(:1ω€ύœΐώ!Ί’?₯7β§ίι>­ŸΠ(4Δ.-ώΎe7ϋ¬αθ+_βr!εr«V^ ^Iόώ{λV­κ,ϋœ½‡Εήފھϋcw2w­ωύχ«τ΄>Y{Ά lSE—h?¦m#Ψ6pΐαύδ/ρΜΠz½qΗz<{α|Λ₯*Ξ°!£AΔ«Ι?AAΌrΤΝά?ρRπΤ~c—š™ρΥlόρœΚ?u)$(u–yΛ)~›B=-9δΔs)τš$XDeφΦsτΠ=τ §΅Δ3l Χλ«^oΝύAώiψGPνS}‘=ΙΔˍώ ‚ ΘG ^ΉΖYό?zτˆΜHΔ+……ύžώ‘Ύάξƒz=yΔ³Πϊ2ΏΕ θ‘X}S¬*ψoΗmποΏχψ|— ˆW‡½gΗmPuš&ώΦj ¨ΗΡ@―‡=LΚVu9ΌΧ—λλυ8†%€ΪGM;Υ\ώ7vTήΊύΪk mmmΙΦAΌ"CΫ·o;9½Yu²Α]~:ΌΓ··αrτΖ>Χθ |―LO#`π8ΐγ‡ϊGΧοwνΡΏζς/vzS£Ρζζʝœœ6΄#'€ ˆ—[ψοέ»ŸŸŸZC»5i\uβ˜>“R²/ύž™]ΟŎӨžžαpτΖαWi‡Μ‘Ρ?Q—z_>°ϊΗwϋO~ΏUsχ˜>“ͺΞ ϊχωίΎ]p_χ€¬meՐγO/vάŽo «Υώζμ[±οόM‘†LG<5ΰTιVςψ;υω²ΟΔκσ!•"™'‚ ž-wξάπΖoΤ‘[P‘zdt’|‚ βΩj;>ΧΨ0&K\ύΧ­κ“y ‚ ˆͺ΅ŸΓ±PXXΰ7^―ΜΰXΏš€ŠShτdTœdž ‚¨™φ;8υΎ°°Π0λT&4UhΌα³ hτ_sα·Δtd^‚ ’2ν·±±-Ρ~……w 1€Χ_oTΡ°(€_yšr_‘ό[-ή•YŒ,IAΤXϋ-ρ,Χ{σ#~“ƒ$΅~KŽAD9ν·΅΅upp0ϋmaa‘Z]½PQΰ-9Rrδί"ν/w€κ?Ι ‚ ͺΤώzCiΤκB΅ZmΦ¨vX_νŸ†#$ΦieŸΙ ‚ ,Ρώzυκ ‚jSͺΥj•ͺŒ`­πWφΩx„τΙBν7+όΥzd^‚ ΒDϋλ … Σ«Tj•JUβTΫ/ωΣ¬πΣ?K΅Ώj½―Ϊ-‡CΪOA˜j}k΄ΏΔ(¨θ‹KΥ2_7@U΅ή—|ή(;“Rf&2.AΔ+ύυλ …Βœ«R©ώ.0ΰp8(ϋfe*z$Υ ύM΅ίμΑΥ7ξ`.·ͺ―EAΌάΤ―_Ώ~ύϊ5>ύΏώ{ψπa9ύΦ—Sw?ΐ¬φ—?HRd•φ—όϋΰΑƒϋχ[2 @Α3boͺϊϊ²†#‚ ˆΣ)S£Ρ?Μ ω/τ¦ΞAAΌ0’fxΩe6d—ͺΎ-k/’‚ β’Ή2²Uφ§hiτ_©OPς²ΝϊA/ΗX·δΥ’jΒ“)r‚ ˆNέ8ζφͺ#ω/o¦RηpτΣП ‚xIό›’#$ζ-UQσΙ ‚ ^$-Pv£_Σx½ψgΖ?*c⠐}‚ ˆt@‹ o°“όΧΚ? ‚ ˆQ³Hώ+‘ψ‰J7 ‚ ˆΔ(•³βΉ›Wά"U/™~δ— ‚xΡ†²•ιώ«χ(@AΌΠCŠmΘ:0ϋ? ‚ βωΚ–“9ύΧΔvAρBkΙ₯ΠT?Aρ²κΙ?AAΌrό[MA/“~‘ό“@AΌršEςoτ?AριΙ? χ ‚ ˆWNΡHώ ‚ β•ƒδŸ ‚ ^9κ‘ ‚ ˆη“©7υ}·yRSώ;™RΌκnƒΞΞΧΫΥΡΥσewζη\>›w― κ{85Œκεύ?[k“ύ“|CΈεߎοXAs―(kο:EΈόήΏΙ?AA<[Ϋq½ϋiΞŽι؊ױ!ώΉ«»ψϋ‘»"šΕχ·k`]2ύρό ΣιΐεrΙQ!κ ϋ{Δi\‰ή|»aρΡ»EγVήάp\9/ ω’Y‘ŒδŸ°€GVœί·λp|rzΆ²@£_ΤΤEδκβ}PΟ@qωŽ:εΛΆΓ¨€ Y‘Έ©ϋΛή‘K—uŠά¦Ύί6XXMϊ'bŸ”ωm‡οV˜n«_ΩΉBŠμε=o>·[ςΫΊ|œŸ0ς(kα\G혩fUϊγ“= ;6"hz‚Ω“žXμ,vqιΠύύΘξό²_j²φύνS©2…–5$ Eb±¨©‡Ύ½Γ=ωτDzϊΏΧa;ΊŸ‰¨hdΏκ]ώώ΅w[τ?εΙHώ‰jΈ?βάέR•Ι!U^–*/+5ωπΟV|°tΕΔŽd§ΚΥΧgΪ™Έ‘MΙ$¬V!ΟTΘ3SNΨΌoڏk‡z» έ΅‡ΞMV•M¬RΚTJ™4υΜ៿χμ;kυμΝ)$@ΌxόχΫΉ‚yη•ζχOΓz³ŸΠ―μ<ύ½[~-Ψ »Ÿ­~ά@ΐνθ+ŒιΕσ¨_Ι@μώc³ΗΈ:|έπ“­UΙHώ‰ͺFύΧvŒ:7MUy UκO##•ίΕ. '€°Uβςq‹έΟ ΰΘΪ6iq²ͺͺδΪ¬}Σ‡κ˜γ+;[Θ»qσI\ΝΞρςpπV³¦ώOBU@<Ϋv=μόΓΖMν:Ά{­Αέη~Ώ3r%‹YΝ’ QBΥέώ«”ΤΆ‰}t+NώΝχΏΉwAόŒ7ί6ηΈ»pΉξmΩ¦pW8¦5·t Ώaƒ>νX›ŒδŸ¨\ό₯_3Υ~ž{H˜Δ]Μh³RΟ>’¦0Δx•Η§Ο φέΠηu„>]Ί©Tΐυtažη’ϊ~όγ(Σ –­dΑ)-€ρŸΊαΣ “α5#tiͺ³.}ΛD,Y1Τ0dΧι΄…μΤΟ›φfΞ‡bί¦““zς‘Ύγ—¬’Ι‘χGττqsu*EήΕ}›Φ•NP]ώuTηY χΉΔ {φ.P–Ήšύ‡±lhΧύΞ]ΓC_kؐs’ΉW΄4™εΊ5Ή4εu'ΐ?©5ίόοΦίΩθŽ πߎνωξr?›ξΌΘΥψΊ{^ς_Α[Τ#ςΝ.ΉwjΧxQΪυ)9š)k5_D΄βE΄z-ΒΝΞΉaM’Ÿ”νΤΫnΎψN$―*ŠΨΕ»rK€?ΰΣMkGψΎzφ:aΤ/#"—§h@›ΈisVŸiž―€Δ]g­μϊB””οκγ[N Ή€QŽεΏ¬M_žΘ3ΠΗ«τοΰπξώΌώΓΆζDΨΜ)z†(²²Υ%ƒ–©λγiτ)šΊzψ†tν8rΠά4-(Oɘ%ρ±dΔύ[―ίΈiψΣοω873Ξ½¨ S/§ί»wχΎΓGNœώhdT@ŠuH@wχώΕ|^'[―όOPκl‘=nδϋfŒkιV7Ξνތ>V΄μχ’μώ <*fWΏΑ§SšwLύgCͺφxΞƒη8_ΨΌεΖ¬ί›c\m­Khμpͺ°ζގίθUEΊms[2Œ[j’ύΈC—~|,bI& y§εΣ<]ͺ (άLΨ΅~Η±”ŒΌ›-ΐγ‹έ}B#?Τ‘μ B]Β²ίfθ€ΧsφΊαΒ€Ν«7Ε&Κnjΐ;{τ™0yoΕ@°&cΟΖ_φΖ§e)΄Zp…bgίφ}†TU\B΅'ΊΫŒTΓr³Πο. 7ΔdςžρέωeΖγΊΣcƒ&2$˜wvKΗ KωΚ―°ΛXκ΅ŸΫ;’9Μ”9vΥΊΨΣ™Χ4ΰ‹}۝:ωεδζϊτsή²1 -PiVSb*‘wgω;oήwD‡Ui‡΅P WκΰΓ­Nϋη/]}οή};»έίιάνΞε†ψcu.ρΒξ}‡UκΒUkΧ4rXΗφmιq'ꄆΌEοΎvqη?fίmάΤ£«]ΗVΌˆVvΞ†ΐΎϊμ?άMϋΛ>­’«ώπ6ΰQ‰>ϊΏ σr?ΘnΛξN^)Ώ8ΦeSk[+“Α£mγMζήϋίϋ]’W”k)iŠβΟ}G„››tmΪχΣiΉΗ:vqu9j26OΈ0QmrH«’§’§ΪΉ)dš5ϊ”\D§•§ddF™MSy[c˜€Jž™ ΟL8zz^μΊHW“μS–ψd›T[r€UΙ3OΙ3OνψeΘΚη‡UΆ _ζŽΤL`eη³n d¦ΛKŠ)KΟEΈ!Ά‘V©φ σ―ν|‡βΨΔώ1‡•₯·vJ>ύ||šΨω/λZ .ΟDΎΉB!° L;$ΥωJΚκ;7xιΙ„yΖΟ| ΅ΏΩΔ13&UΫοΨΎmΗφmΧmάz>ι·οόΩp„yΒ8˜ύζ! κΖΣ6›]σ½<]»χ/¦ξ<―†]ƒ c›­r·loI―jWažΏ^}w39ίν?νΦΉVbΕ‡Ό`γμjομjaΌ1ΉΛvͺ'΄~ΣΧΒdΟ«eIώŸ9š¬ΤυΆ―Δ ε Ÿ`‘ΠΕ~2naͺΆ’oΥ «ΗεοΨ6Έ’‘>ΌdΉ™3΄Ι –벑«Q%s;z›Τ(Μ O$r„ϊ¦RΛ`σ⦌δoΩ9Mb^;šΆχwEf.(³€ HΔtΩY&²’ž‘‚§@AvF±WδήήΌΛγ:xΦΌ@Ω‘o·₯ΦMˆB§~ΜzWt6αΫTxGŽUXψν s|, °G'΅<ϊ’΄+UJbi» ω:„ω0‰i†–θnYέ‡φοζ$ρiZμ rω| M±nγƒφ/7³δΰΥμœσIΏ¨ΤόΫH:Ώmp ƎŠjΨΠξΨΙ3[cw{yΈ9 τΨ@Pί ΘΛΥ=cΚMΡgί|p_§zpMW?~]`Χ§£]ŸŽηΙ G+ψzηΡ_ =Μ[υp±~ύ_žI&ςrΩό†υΜΜ»ΧgœκδhŽίγυ©ΰΩ6ͺδ?ΌώΎ–&{NmK{ώ?s΄*“˜¬—Km³ΣYΎΌDϋ…ν¦ίwιͺτίŽό8©]ρ¨\›²jωIΩ³y’wηύΈηΘ™“;~œZ"ΉlΚ±t1ϋC«ΎO1”—qή|τς©ύΗO%žύ4gHš·yρ›•Ξ΅sˆΘψ1+%ΣP„k©¦J–T¦]zJ^±U‚ƒ\ΝηΧ4°OδΰήΎΌ’ψ‚Αƒ"Γ<ΜPXΖ΅Ϋ΄χμ;srΗw£ΌKΞP$ΛzΩZ”N£Θ8΄xβςΤβvΕσιΰŽƒgΝλ,2™dΥ)ϋΎš1fXθΫ’6]ή}ό— Ά»˜«ΡYp#'NίψKagΧ fΖ$Σƒσ—9—ψΫΥμ?f±uϋξ ΣΎΜ+^ύή Oχ–†₯τΜVΰΪ¨OcάM»υ^²Ξ4/ΛyP»†Q­κΐ_κ δΑ;‹ώ)–6gW;χ†ΐΓΗ4΄μΞΉ›φχΉJsHΟ^š72ω?sW΅‹ςg ΡŒΫXψ[™ΐό£τψΫΛn’Q+ϋŽυ-OF£’ω/(U?SΫ©hΥΙIΕω9^ΏnŒ!Ξwψpέ/x·λjh“bγ5αύΚ«€°οMs‚ G›FΝ›™}άi­a˜¬Pb@sfo’1{ρΰY³…£dΔQΗBWΛ°»bs‡N3/Ψξ၂-ϋΤ،Τ,t ‚&+[ ^?Uφ₯ΈοˆΖͺvπΝ>ίψu+Ύ=p>[]βuj•²₯,ετ-#j7|φ¬ !β*LrτΔiϋφ,‰ω§^–ώ»»\²{χξΟ_Ίϊλεσ Ι’ήτωμEη“~Ψ·‹±[4άQϊuΑ-ΉβC ‚š2―Χt;Αo7ικ1QΓEэ ^ΒšήyA¬αE4­ξbΞΏΥΆοDΏξ υ’ίsΪ±τΦΧK―]”π‚œlδν—κώi*ΨΣΛόλyΎ½Δ+ε7¦ό~»ύ*‰kw~=<όοϊΝ{ΥznγFΫίoτΊ5ΙHώ σΒδΘ+’²ΊZζ&KΙ.ŽΛŒ^V6›χΈzA °ι©™θ\$Aέ‚M<Ύ«D„Σ2γˆP0iZzqφ|­lΟ―ς’«x<γZυΌτT\Νΰϊ†ωπφΡPe¦η"ΘU–"e0’AΓ™―bN³PΘ²4πe¦+‹KζS{uφνj2# φtεΑtΠYnr&ΰΣM“ύΛF'ίόEιͺ‚η Ζγƒ5“M Θm6q]ΨDFžž˜–ž’z1[–•§*φXeς†1}/NϊyΫ‡f͞wγ¦J]hXξWrpλφ]†‚ίv:Ψ³ˆΑ8—ψ›!₯s³¦~Οηe€^–šžKUΣΐUΏˆ·˜κλœ²m>lœ܈ΞόΟΊΎρv£βDυLŸπΦλ‡ 6ό^΄EφψAΓzΞNό•ο Η΄.~CXψϊ‘ΉάυΏl•iΧ]ΐE4]TωΆ?¨ίΰΣ)-".;­½˜ΎAΓϊΞN―Mθ)ό¬“΅ΙHώ ³ς/δ/Θ‚ςš¨ΝJ4ͺ$–ΰθβR>'GgW! ΣδZ•J”ώ3εΆ―ΈΌF₯*ΞΝΪ·`Ζ>σ₯Pδ*σ Ή‘ΎΜ™€όbΆf 2³΄Π<ΐ?λŽΣ™`e)Ωθ©K5Ζδο.΅W¦όΝ05Ϊ6@θdζu8Fό\ž³o·±3?οκex\ΎKPw— ξƒΖ€ζ¦4ωπΦ’WYι·_κ»n€Ή¦˜v9@@›υLW³sTjγKcGEό#Kφ€{χξ•€τςp»τi$„΅4δφι/ξSušFvcήo6¦ͺLͺKPΦΒM­…΅Oφz»f΅«δ»Φ"υzΙ« ί3ΐ‰†AΆ2₯xA\yt©›η0*’Η yQ ˆΉUͺQ˜AΗZ΄/½F[yξόΰp$d`³eH½Ί‰β~6ΔφσβFΞν;bxwwW±€«Σͺ²“;6m>]<²…¨d‹^ηfM/ύ_ΖΏχΜπφνQμ%4,ΩΈΓY΄μŸ Hώ‰βž9π³Υ3ς†.1μΈ­<9ncr\Εt<ο©+ΖzU9νΟοώι΄i1†W•Ι ‡w_X!—ΐɟφ¬α„ΊΈδήFOE›Όp@ΨzG¨nΚΥ%ώ‰°Ϋ΄ ’ͺW&ψ„πβŽ–œΑxΆ7†"<ά™}iliA;[ ώ&ΤΙwO―•H:Oψ0˜¦ *ΚχγYCβΗΕζUXeΚΞ);Ν¦υŸύQe[•ζς/ύŸ4ϊ½AΏ5όΦ_e€]–x«ύ&3A<{(ψΌtΝ^QίνZΡΫ“Wi Ζ%bΙζŸi©*–°φ»©• °!3Ύ[7Έζ» ρ?ϋna„Έx†A%—e•j?γΪwυ•«“^o˜·ΙΚ{— β}zψή&Κΐ σ·`M½K—nξΕΉi³NοŽ;*ΣPƒ2_yΑσcΏPεΰ[θ½vγJέC/– T…W³s*~ωΑ8ΓΏύχή½΄“ ίώ!ύeD±yχωڏ8ΉoΧαψ΄tΉ²@₯γ EM]Dbί°AύΓ\,±σ}Ζl9Ϊ%~Χζ_₯dδέTiY†';ϋt­ψ“?5)gΏeΗϋΔώ°λPbFJ­γ …"WIηΘa½Γ=-šSΰtφe’ „ήΎ%{Ήxς~Κ5.ϊ·τ•Ώζ^§]ΎβHΖ5•šΓ«ύζI/1ŽΑΣΆL9vψHEΉR‘P¨΄ΰ E"±PδΦ;²{@Σ*ΝχZΓ†‚ί>Ÿτ۞ύ‡«λ—γθ‰Σχξέ ¬:‹ ˆ:‚Γ>όοΌm½^oϊ‘δίRθυ?6όeψΏΗsη·–Ν©έ―2*υτ˜…χο?Π§ϋΐΎ=ˍώ Ύœ>ΡTζ―fηΜ_ΊΐδOΖΠθŸ ž I[·r·±±αp86#666ΰp8‡Γ‘Ρ?AVF„‚θχ}γΟ{φyν΅†έΒKχπωrϊDΓΣ ώ«Ω9+ΧΠ!ψm~‚xN ω'Βj:Άo›wγ汓gΆnί}5ϋ¨Θ†υόεϋή»wμδΓΟό4ϋŸΈdO@‚ Hώ ‚x!‰~o£Pπsμξ΄Λ΄ΛR6’€6G‘ ΩΔΧoάΌw~Ϊeiκeι½{χ γ~~‚ ω'βe ϋ;›5έ½οp–μƒP1Pΰ0°oŽνΫ’Ή‚δŸ ˆ—/·˜ny7nžKΌpύΖΝΌέΏ€§{KG‘ΐ +Ι?A/!Ξ͚:›Ϋˆ ˆηΪφ‡ ‚ Hώ ‚ ‚ ω'‚ ‚δŸ ‚ ’‚ ‚ ^(κ]VΪΎ‚·]nΟ”μω_ς {ώs Χλ‘/ήϊŸ£½kγΦ’š Aρ\#nςf5ςοΩψU΄K±ϊΓDύ‘Χ›ό@ύc㟏 >Ζ?τ¦$AρβCΑ‚ ‚xΩPί#ω'‚ ˆWŒ‚"’‚ ‚xΕΠ="ω'‚ ‚δŸ ‚ Hώ ‚ ‚ ω'‚ ‚δŸ ‚ ’‚ ‚ Hώ ‚ ‚ ω'¬@Ί¬“—€eτs_jŽŒmι%i;'υ)F“}ς‡ωc‡τiΠΚ·}§CίΏ,Vͺz±,zuUŸ–^έHλϊ:ŠΝC$-ƒ>;2ΆΚZΩP“±gρΔχϋχiΠ*¨[БcοOΧ›΅¬“—€e—ωιζO֝œΎ₯Wΐϋ;T ~ΩK2hβ!³GΚόΆ^’6_€Ύ¬}ΓΣjΙ΅'{AIΛ.ΛΦiο§Ω?ΒK²Β­‚:Gτ9}kκMΙΙρ[yIZMI"…!ω'ͺ§ aΩΐπΑγVο>•‘§αŠš{ˆ •₯œήΩ­Σθ_J»o¨b£%-½$·*Θh/&uXƒ σ{‡›ρσ™tW,ρς@™qκη˜Aϊ|™ Οή=\eς!³ͺ¦K;œ¨γΣ³³°τ φΜΒ%Iš—ΞVDM`žώ₯y7ηαfvΪή%£""Χ\Υ‘Hώ kl _³Mͺ„ŒZ½\ΚοηχˆΫyφ|bςζYύ] H\>bκώ›UΊπ«²ΙŒuE][ψIε―93uw–VΤeφŽ ηwξή°nΣ–_ŽŸίΏ0BΜζΕM]pHΐ£G˜3 ?% ₯ΧΠΝeg–/ΞιάλέυΉZX΅': ₯WŸεY₯E94: ₯—€Υψc₯SζYk"Š—YY\ƒΥΪ°l;σ\;rάΜ0=pβΆΈ_Φτ3Œ‘]Ίts7—KP™‰ό‚πŸ†πΨ¬oΔZ3_m-z¦Κ­Ώ3΄ΨέΝψ5cM-Snm‚.{Οβ‰{tnΤ­χθΟΦ'(tρ[y΅Ÿ˜`ΎιΤ¬zδ­n-–_‚-Ȏ32’C@+ίΞCΖ~Ή#γ©­Ψ(P(Y ©«ˆK*AςrӏL4|A\ŠVθήή›―ΝΨ»dά /N›τŠ=SϊφžΊνpΆN( ς` RvΗ οϋώΦμΚeYv1`ΌƒQ—υνΈA_S ύΓ»»2Κ”} ήδ—kVΚ’ ™hθ‘2x]ώΈŸ ΧΊ»₯……Aέ݁Ό‹©ΕΩκ2€,6#)«ψ~n¦¦εžaν-ΝΏZVΞC»πΐf|5(|θτUϋΟg©*kuΝ»χφ¬O?’¬¨ω/ΞΊΟΌΙώ ›Ά|§ύL™q?―ώ₯Έ]—Ξξ-„μπΎŒJz.€…|Ψ;3!1ΉμΪ–<-φ¨Όˆ™³*€/±t”;Ψ΄Ψ£e†Β’QΣ*Χ~@sfsΌ.η%Χ+κΣHgΎ*Οtœα5ΛΨcΰϊτo/΄ΦbCY|!΄Ÿ2ΫTϋ­»λΪβΪ.Δ¬4ι’nf€εΒ=rT¨°dgቂΓ]­Ι΅*š‡ο9tέαψδ=ί-™4°‹3O«”žή½bζΈΊψΑ4,ξέ»Lό?λΨ)ΉΩΘ .Γgr…ϊπβ―.κžΪ3eIΤGJ=‘§‡Πj GΑρΨD-tͺ«)I Gwmή—™°zδξΎέQΖϊmΦG²$S,ύs_ΰZbr.˜@³‘’|%ŸΞ{χΜН»cVυ9πΉχ)Φϊ"ΦΊ%Χ²΅X~ žΐ2uΒ ιέEx Nž‘…AŽOͺ₯ ξ:₯iι4Šτ} &.93†ηzςΛ ςHώ_F„α‹~ώΡγ«―>sxγ‚Γ†η* όψΣΘ@!€V« <³bξsγfΆ’žΫ=ΠƒΩ›š™ Υ ©μΡQέ¬Ν2|­Vπ…ΌςΉσ…<€Υju@ΙΈ‚WεΣ«Σj5@Sq΅±D^UωX`(K/ΔζIsέ£φΞ]²<αΫ›Γ~ξZƒ»~xvχξ</‡D•Α2>ΑΎ|Ÿœ’&₯뺊Sΰυσ±JxxΦ•O•Ÿv“qξbςΦWθΗ+€Od·/{9 έΈιbΤ—AΖρθ€€eTCό_~ꨬŠΘIvA“§υ8=ιπŽ›ϋξσž©Κ"fUΔ§΄Zΐ–σσ„<@]ω―eKmk±ό^€οκήoΔόovž]!„ϊδΎLptχΩIΛ½m“{zσ›φH+}§i·αBhΏšnvEΊ.{σβ]΅š©vυρδΝ8vΎl%&ηΝέ­x^=|\Eβι²»‹g―Ήmω-ΜΔCYx!ž{‡@>€¦ƒgMσaΨΤ―b~UYΧl™·•u²σRλ£Δ\. ²ONLΛ…s‡!€ζήB(S⏝ΚfIΧ:Ž‹Ίϋz0Π&Η&škiJ…ŠL_ wμάΫ—"ώΨΙψcΚΦόW¬½ξ³¦0lΖχ1ε–¦VŸ©ΚΆΥ>S5O 71Ήμ+ΩηSΥOήδ5}δ­h-–_B›Ά·lΥλœRρπ¬}οW­#ΔeV§‘ΧώIώ_ ΈώΓϋ:²Ÿ|YζΗu 2b§Lό:ƒ…Kοαν ’|οƟVΜ]wδΣΘΥΐΡiτ‰μξ Υρ…s•ΎΈ¬ΙXώΕτ…«weUασƒη-μ-†:aζ°χWΎfšΦώι‘£VdWŒeVptUΌΦ&€κψŠ%§KΝi€›¦o”ρ ³f΅chd{δ»cLΦ‘έ<ςύζ ΅Ξ%ΨΣ\,0”Υr>{¬'£MX½ΐψϋ4–έ5—Ηδ'K6΄Ρ€»l―J ?(Μ‡aΣΦo”Aθοk˜ƒπθΔC֎ο/jίnώόΧ EπΓ‡uB{κ‹QΣwd˜φ)’–O]žΐΒ΅[Ÿ2ΣκŽΑύ(,ό6³βn?UΈΜ‘³Ηz2Ϊ”£ΙUOIY`ΫjŸ©8τ]#Ϋ3Θή³5[SrέΔZΆe‘•΅PΣGފΦbω%Τ‡/8€0&ε›>χ€ ‚žΓBωO χ«V@ΓZc=ζfόZJƒW ώ?ϊο;yΝ<ΕΈ§ΗDžY.5ς Uή”«΅#ŠX²φS_CϋχžΪwΫΘ}ΗΗ…Λά‘ΞΝ–e)΅EΜeœΣυϊxιLιΈ…G§G€nςυqv„:+5-WΛ“LZ=MRΥSΔ™Λ Œόβ@ΚΖI]7ςΔΞb†UΘε - žχθ k:ywθΡΚ<† δ]6Qη2ψ³f΄‘4citφ€-ϋ&E€ΈϋzˆΈ*yzFž–u™mν»:Β³g%Dyxυ°Nϋόƒ<PdžΟP²ΒΠΥ³;[΄ΐPΦ_ΘσύyƒχϊωΜΒ%IVσ-»kί~½]χύ$]2,"14PEFE…¨g7χ½G­²08†z"MͺlTYwˆ„9œ¨ΥΒ;<°rq΅,κυ?dΦΊͺ±«’χΞΆw±@μ*3P©”7•jŒΈύ¬Υ“Λ­Χ†wσILVi-‹ό—Ζ“ή_΅ΏΟΖΌͺSUo[ ž)λ˜=TττSK†Eμπρuαiδι*Qδ»ώ[vΚͺX4P³Z¨ρ#oyk±τνBTΗ'υHΫ qκ”YΩy*–η9lιΜξθύώ{wΧΤ•·όwCHI@ B«D­%Έ Φ Εv¨K΅΅―Z‹U_wλ΄vj΅΅:’νŒ]Υy;Vj­u©E[κZe,.²`kΠ$$@Hςώ‘δQAžο' αζή“s—ηœsο 6·=‘€ˆŠ²sΥΣ.ΪΠ€oŽ[°§Ι DγίY’˜¨hΗά _ερFšΊiBΧ;c€ήiψOΏΓ?ν\ώRLΈ_Q˜“[¨ˆ#GΏ΄vχOg>x±α.8αΘ΅ΫχΌ3q°―&/ύμι Ήr~Ÿ§_‰?°οΣΝ6Δžύυαk'ΚG—~φτe)?xβͺm‰{ηΫάΌύΖ­?uz{ό+±ƒύyςΌ_Σr€jQψψyœή³|°(β…9“Η² βoM}R$Ο=}ψdZs_τ"Œ\}0ρΛΏΔF‰Τy.fΙψ!1qΨ—Έυ…Φί¨λϋμ¦cϋ?}et_šš|6K&ˆšΊϊΐχ›&΄κΪb6Υκρ#ή\ύ’αοΣΘY~jΎδ= KΗ‡ δi'žΈ(=»qί—«žϊtΜ ± 55LDΎΓž &"Γ©άϊNήπ CΗnD 5ΝrώlΪ²3·ώtlϋͺ©C‹κ’ά¬©šοΏσΔ©„)‘M― 3)ŠGΔzδί΄ Π%«_²u+‹Ίe±O΅i`λΑέρΟςT瞻!ήΈοΛΧσx-_ΗΧΆ΅Πζ]žύΦb{‚ˆα£Ÿ;gΣχΫίγ#ΟΙHΝΧxJbό3ρΐ_#…φ9ϊΩ χ%’`ΛU³WeΉiο^ώωό…Œ« €1•*}όΨz½ήό‰ιί†Ÿu:ΓO†t:]Eyyx°?Ά°$/ΌzKνή·ω¬ϋύ“I“Ά βSφLχDuΑ}wθbώ¨°ξ‡acΔαpˆa"†aΠϋh?‘_ˆ)ϋΣί) |z½Εw©/LΎE>αd?t ˆϋ ŸγC€5+dΙΥjyιΥΈΰ―σy!Σ}g6ΐCƒKμ‹υΧΕΛ^έpbΝ”†λ7yβ±λ5§ρπΘ6ό§ί‰ρyι©9·Šd$ςνγα+DΕβΰ'G>#ŽD=@Η„sˆ@όβ€ψΔ? ώρˆ@όβΐ ώβ_‡P^!/½W‘R©QvˆJ@όw8’šew!OԝΓ0¨»ΠλυΧoζQζ₯μŽYB>οιιαΥΣρίϋύ55Jοž\"=ƒψ°Sφλυ =ωDXΗ,‘V«­ͺͺ..)©ͺιλίρί΅”ή«πθξζΘu`†ˆcˆ4Ϊόυκ;r9άά„έnάΜ+Ή[ϊ€Η™J₯vςς`‡ΓabΩ`?ιt:κΰM"Žƒƒ·—WΙέ»ˆ.ǁcΐp8d?€β_ίYξnλζΪMυ‡κ/ρί0 C†μGόΨε¨ͺΣιFOϊίύ'rΰ80τ ώˆ±™šC…΄Ώχ_Dν ωOτΰ ‰ψο0έΈ‘Šπ· ίϊ‡μ€.½ۊ€ŒΜΡ |}|˜=Φ}φ§UkΧU)Dδ*Ό·nmΜθQΊV0ψrτΫε±jν:k·MŸ|΄ι“έV­]§·ίΜυ8χ6€­*T2qWQWψ¬₯‡ώF²ΌΣ4/ΫdI`θά}₯u]<*λ”ΕΊ(Ϊ9Y8r}Φƒ(NσΛ’_ή·rnμΘαa‘’ΐPIXΤΨΕΗe³<νάοηώΥ•εδζfdfšI?­R(f̈‹=*fτ¨3βͺŠ€ŽšO““›ΫΉ>#‘CR_ήςΩΟκΰ寍ΆkšρHΐγ£ΊΘϊκdίΏυκš QψθΙcϋωDj§ˆχpΛτΆΓN³ΎμΨo…#IGί]»ιλ1£Ff3jδ‡~ΌzΝίM°~έΪI'΄£œˆhΏΌM±“3¦Ϋ3Ϋ·}Σ<$…‡7”zLX;₯oϋ¦i‘μ―/Μ¦NY?q}uŒ1г/((|ωogψu”2ΩΪ»ςϊz(αOtψH’ιωΛ/Ώ$tά£GEϋψψfεγγsόΨ‘³?₯(*ς*Ε7ί|kzγΔΆΖƒόGό?’‡γ y;L󐺒ωY…―~mΏ]Σά:„³.μΧω/’ωJΒύ°Ύ:ΕϊzXω_οΉ γή~k™Υˆφ}ΜgΖτι†η Ήό‡£ΗΫγϊηΘΐPIΰ‹_εν~Εl˜τaž]λυg·½¦½; 4rρq™qΫ•„EMšσχΆ~›·½Ύlξοy;bC%–ύ[έ€1ρF”$pςŽ›­Ϋ~X7ͺŽ— ˆ΄ωhΘώN½ΞG“ΆyξviΘΨ˟—gώξΨφ7ζŠφ'Ντ―o”ΖΌΆΦ7υΠί^=ύ—9#§φ!ζ7©²™†x|"Eς†Ή9Šˆq‹&ˆdY‡Ώ;ψι«E΄;i~°iΧΟϊϋά»’©3V/ρ¨eW“μ|λ•<υα/ˆΪψρδώηφ_)2ώυΑόΦOS΄ο΅Ήο₯σCž_όZ€@–~dΝ¬5" ρΙ|Ίi«γkˆΤY‰›ζX›?«ϊa±.ΨχΗ.lž›£ˆzeρj~QκαοŽ}ϊjνOšίͺωΘSώʜέRΟΘg§ΏξGωη'%ΌφJΦ;»χ6”G~nε+sΛΔ1qΛ— 9gv}χΡŒ¬φo'""CEe}±™fΖοˆό|ρ§›ί^ΰ#·zλΰ‹±χΓ3φN±^ω;_{υ£Λ‚ΑS—Ύ5X€Ι9™πΪA“7Ϋ©<6—ŏ˜Ά"~QήΙwgπ‡Η½>ΖT'‰ΘuΘφ³³Ψ‰Η'M^βsΥA ίΩτ–H½{Γ†έoΏ*2ί6Xmσ,Φ—­ύ]pNΑ“L‹νۊυe―γFΡ}<3·hΑόVMy,K*Uϊ.ψ¨Pκ ςmyφ^uέ½κΊ²ͺZ™BS*Wί­T•TͺJ*”Εχͺο”UIeŠΒRyΑέΚΫΕεΩWστv•}εšJ₯­­Υj΅:ΞΖΤ©ρCBΒ$sΎΊYJε‰EƒΓ^ψς†ε„Ώ¬χUaK3³1qYq ΛR₯­0xuŠΚ4Qڊα‘K’^Π~χΧEKTVfΈΊHxΐˆΥΏ΄ψ―|<% dβϊ,U[¦ΙŠ ςfreύ 7βBCΒ―N±6Ÿ”7„Μωζn{κ§Εu‘?$$όΉ―ΝgQϊΝΜπΙς”κΉςΒα#Μλ™…ί?ύSHψ%'>*{ύ˜π€ΑK0UGΦΖθπ!KκG_™ΌtDxΐˆψ_ŒΛJ^$ ³ρ’^――<όΏ’π€qŸ^Ρλυͺ‹$αύšΖ~]¨RW ^Ϋ°%ά=Ά΄HxΐˆψKz;—‡Υ²Œ΅΄1:$όO_½Ÿuؚς΄ΌΆΛ4-Luaňπ€qŸήhλ6ίμΎΓb―<³ΌΘ —Ώ΅ΨžΏ›?(@bͺ–ΫOkŽ-Ȋoα—:N«ΥΦΦΦώ’ρί*₯ΊUiq³BΒ[ϋ€πiq³Zϋ.Σγ—ŒΪ7\^Θ»W^^QYY)—+Šͺͺͺκκj₯R©T©T*•Z­Ζΰη#3gΊΈώα“QώDEωχιΎ1ήΰ)“MΛβGNξAŠΛ© ƒ₯R“FzωfΓ°ο‹οoέ4?JΟcπϊώž}ύάϊ¨–WzςŸ‰Ή‚˜Ε %ό6Ls3νΧ"D=?ΜΤ9ι;mF―¬ ‹z›>άƒdζυl[ΦαSyδρτΜgώ`8?όυ„ν{–FΥΧSΦρ³Eδρτ̘†Ξ›0fzŒΙ~>mΦϋ䇇‘P$δΟ7Έ/ρ=„BRΛjφλβΒeyŒΧ°%xŽ™8² l―ς°YΦƒ¬C{•Η@3εΣΒψ}"|ˆdeEmΫζmν_-οοΒαSΖϋhOέl˜αΩƒiΡ8³²Ϊ~Zsάhα `Ϊ―χϋ`›”ttήό…MIIG(Aόw>~Α>f; ŸΟ'Rί―³fžώAζ7ωŠ}ˆ€ERΣ ƒ¦?ί‡—σΥ”g¦ΞYΉi_ςεΒvέE¬ΞΪΎυŒ’Οτ%fΗίΦL#+’yψϊšU0(Jά ΦEγznTΟΆGώoζK‰όC-OΕ‘QOcε…ω²¦ΣˆC|ˆdyE Εζ †wπ‰H`|ΞkυΊωτ5šεϋϋZŒμΪ­<,–υ@λΠNε©ί6,ήΙ'Λm¬5ΫΌνύΛΖώΏœ=-ˆrμ»j|‘πā4ΟψiΓΜc›ΕφcŸγ†¬ˆέ6θ‰τϊΦ=ŒoΤYοX΅ψ6>t”ΰά'Δp·) EΝq>ŸODj΅šŒ'ωέ}@²#aΧ©s‡Ώ:ψ+βy„Œ[όw¦„Άαvβ“&ήŒύtaH§Q+4D|O‹" „ΌN°.lΥ³Mšˆx‚–&Χ(Ԛ¦Σπy"Z­0[―έλK­VΏQυωD »—‡Ν²dΪ«<¬Ά±Vlσ,φ/›ΫaίηγΆζΨξτεοGς)_b./.i<ˆ`σ#ΩεΈ‘Vάχ;s&>7aβsΝήΘ§PTmέ–°β­7;i’p―–tΕ΅hή‘ρŽ CσΛΨ°#"=ιtΖη:CγLGŠJ οJ₯Άξ5Ψ,~ΒΠqolχΙ‹²>zhΟΎΓfΘx§&yΆrQ©Ÿ}žFAo-‰Άu>ίPH‹=Ty4κΉe<ŸG€Q¨[=Z£ β ω­›ny]Τ‡Eε«Kεχ£iB«Š’><,ϋΧtqΫ§‰<ˆ€y2"Σςά¬<Φ]hϋ›α`φ’¬°ˆE=η4_ΟΝLΕΑ"Ί{>‘Ωα³4νΘ™| ‰™αIDB±Ώa55τΥyΩR"±+λΘζΊπυ!’^5Ώ4[~+OFdvΞά^εa±¬Z‡v*»ΟΞr›g³±Ϊί…#gΖϊžHΪwA&L;Y$φΦXQ»>@;Ž"‘Ηύήƒ33·}±έ”ξ¦ψ7dξ΅kτ7MΌhΡ‚uτΡ]’ξ-L€s&>‘’ε›i’N›ξόU§½PF’A#MGμqγ§Ύ›¦n:^ζϋόΖι-}E±νiψƒγ¦ϋ'%μ{ρt O––΄3έgdπ―gΜ:ά…iGΞηŽŽκ¬|"’ž;|ΐΨ-σ:}„o«κΗίaγƒ?ό(yσ†γΌιΑMΞΙ-ΫsEΑ”Χδ’~_‹z>(³¬g6u2gΥΤS‹χΏ;eVϊτqΑBuώΉΔ€3ω‚ο-m8@KΕ?vξαwgό9gφ˜`&ηΨ½gΤ>/­ΪͺΝ‹ΝΊ7=ψdΒᷧМι<ϋΘΎlΡΘ`:#3+ΎΚΓjYlΨ©Ω”‡ύvhγ³³ΨζYν_lφw#Ι― Ϊ²κη4ς™eyΡ[v:nπΗ±λm8ΫΛz|ΨψF©Tz§ΈΨπΪcήή>>>Dτ—Ώ,3dΏΝεΆrLρφ ·zSŽϊ½Γίn™ΗxŠƒ"$‚ΆL36ώΎήϋlΓΞ|‰‚ž~gΣFσο΄αGί·½ο§ŸοΫ½ω¨L‘α |ΕOŽoυςΒ[sPŸώlΗUΏ€…Ϋ~ΨLCΔ^žπ©zέζc‰ώ’θ2|b|Β”’•§Ξ˜ 7¬9aή9’žωtƒa^ΜΖΙ#.‘fS?ΆψΟώhcαΊΝΗVΞϋ–ΎΑ£Ύ·Ρwϋσiy³«©4j"ρ΄OWюχΆ°3_Αχ ΊψVwpδίχ†lή²λμΛ­6iΓIDAT–uίixίΰ‘om[ΊΠ"H„#ίί} xσ‡‰IV}E<?ΙΔψχO—΄ͺΗn]Pπςm›hέζƒΗ7―9.K&J˜#_wφL‘ΖήεaΉ¬Y‡ΆΛΓ~;΄•6·y–λ‹Εώ^ΟsΜ”‘λ2Έ§4Ήθe™νrά βίοiGκ̟·hα"zλ­eσ,ͺκμ1ΑΤ¨Ίβך·ύάyEhp KrωχλA}{;8p8Γ0 Γt”:J[Τμο<ί9ž4³SΕ›όm“ŸHwδ̊Pθ Ϊ΄Ν·fWg―žδϋή‰½/ˆ:l-˜Ϊ—.‡…΅nοŸ?Qζ₯KΝH•J₯wξά1φώ{ΜΠϋ'’άάkσ,ͺ hξʁfΧ ²qεΚοC"Ψ±Ξ_L}",Ȑ,Ζta‡C Γ1 ƒή?pPΤ€ώύΏψβσ6W ώځϊζ—;D›?άujΛΊο4<±δΩU/Ÿ‚τlσνŽμ=kΦύL’ ρkγ7ŽλΓώμ>£Ύν7ώ8€τσš κ ~ύβΧώ­ρΜ;ΟόEόC3ΏϋŸίίν„εEΝ\έL¬?θ:μ±Ν³Ψί…/l½ςBΧͺفΆ<Ά/ΈvήO‡ψhΰ*p%’ ·νˆ€‡¬ c , ’*Eλnν9rΔΒ :ΟΨ?βΠ0ψΙΗ>πΠ Δ?<κ hίωΠε χrΟ_ίIΚ‰ή? ώωΖ©'¦Ί.­V‹ψο’ρOz΄Ί¬κκgΎΣ^(Ξύ?dN|žR©rνζ‚€={VϊΞΡ³j΅%%%ήή=]‹§Gχβ2gg'γŸb;eO­V[S£,..ξζβάλ1/ΔΧέ]XU­ΌUp籞"''ž‡Γ0 ͺ έρO:Žˆόώ{‡-§3ίΙΫ»ηƒΟ~Δ‡ΠΛΧ«ΌB~WvO₯Φ 6μHΰ*$’πΠ@TβΏƒŽtw’ΰΑΐΙfΔ? ώρˆ@όβ€ψΔ? ώρˆ@όβˆ@όβ€ψΔ? ώρˆ@όβ€ψ€fp«ͺͺ»ΰΗΦλυζOLιυĐ^―Σι ―ώΣιt55Jl4ΠιγίΣΓρί(ώυυ?7a£€Ξƒˆ@όβ€ψΔ?t \TAkύQT‚J°#''ΎJ₯F= ώ;΄Η}½P Π‘έΎu«ε 0ψΠε ώ€ψΔ? ώρˆ@όβ€ψΔ? ώρˆ@ό ώρˆ@όβΠ±pQCΤχ“Κ’Ζ―2nΞ\ο^όθˆξ+FΊφqμˆΟ9™χΔ!5ρ%>e―Ί9=Έ%«7Ο[UHD̟ζυ;i­·“UΠmk•ΪΖ|œ>~Ο©ˆRφ^sNKDδηωΫ»’`"ϊMκρΟΚΚ&oΰ;;τρζKϊΉ―yΞ-ΨΫ. χv¦―TΦζ^«JΨ_Ά^zD† ιΤJmn~ΝώS'Vώ±­υθύ€0nŽή\"«δu·•zcδ”TΎΌ•—iθ•KΎΑ^<••_h‹K΄¦n½“#ϋ•B*e]±\gQWΏΉσ^μ;=ϊ ͺρνΓ[ρΊψmoγͺJeβ~ι«5‘ΊPΆδgχδ‘Ψ―Y ςΌ·ςrqzΑΐνU†ψού”η47›3β―yΣ©¨ώ§εζ­,»¦#"u~EbqΣϊ@ό€8Ή9ϚοWQ–Ώ,_O€OIΘΪ0 *VlN–§¨²‹kUŽŽΑ½x’~ΒΧGΊ»~_·νγλKI^g>Λ'""ε›+om)³|±V1ωΒ€:"rXπfΏQVςK΅DδωΨΑAΪmϋοnΉ’.εx{;ŎιωώP'w[%·U6S”ͺœ“mIWε”ΥVΤ2ξnŽΑώ žν1­W£Γ—.'KR~ͺ Nεȍsͺ uZ\··Κp™ί«ϋή8WχΦΞΑΕyιΤξ Κr‰ˆ4Ω2"Δ? ώΐήψ³Ζt[Ή½JMD…Υ)•’`7"’œŸ Ζο­Ί]W?•R“zE“z₯*!YώΩ2ί…ή"ntŸ©‰(皲βYΎ;Uͺ²ΛŒοΘΉ¦2ΎXPm˜s·X1Qe±*5_KDn.χ^>Y™$7ΌC{»°:αλόSωgΖuk!5Y”ˆˆd•“7JλgNDϊ’2uI™:%£βλY}ŽεΥΏMIΌ=ξίjγ{]mjFι˜όκ¨6Τe­jε%)JΓιύW½‡΄νΪ=‘£7Q‘‘S§Γ…VΠΡ`‹xΈϋw‹¨οT§© ξΎhΚWg^΄D8±Ο8†-―Zς―»ΏΤχsιMDDκeΆαύ5Yυ³U+s ύαυmCCCά-Ϊ2+―T&Ι//§hžiŒόφΟ²ΔΚζϋύμΚF€=r¨Ψ˜ύΞΌθAn3ΉH„ŒαW?’₯'£ŠίŠ_6eΏ³cT?§ g†ΚjRΛZ[‘Ϊ”ύ….§ΰό)Ξwi[{νͺ2Υ­ϊΓ¬·GZ@οξ7G/.QιŠεZ":ςCy!_½άŽ-σ‰u#"*ώνΘVδQIE|ΊθψP.υrv.ί₯$’+)¦hoΊuMΥάeΚμJβ¦ΛΞ7^ζ€Oο8sργ;"xDT‘{gΨ'ΉDT§LΙΧ-Œ°{ZΆe«U&^ΡρϊλώŸˆ9DD5γ–ίω±ŽHΞͺ€hiΎ>*7ŒΥ»ω{{]4Δ…¨V΅qΛνUΧt­ͺΕβtιΛηŒm ―A>;FZ5~ -.Šί[yΫΨqŽΕΘ? χχ…#cΊ:½²VO΅5GŒΙΗ™ψœWl}―άϋ‰žο2μυϊ”,₯ŠˆcΕ†ώ΄&΅@K€Ν.¬%"·~.""MJŽ¨6«ΐ07^tΏΖ‰Θ}a|Ρ=¨ϋ$ΓS}EΎ™td_6ήλ³ύΎ_μχύbίbγΑJ%―+1ž2Π« O*«χηkaΦTΡΓ₯ŽNoOνΤͺ:”5œς'―ξίΜ΄&΅UΛV]ε.ΌΚ]x•ϋηk~€ Ζ!κύ”(Φ( χχC­^Uk`¨L«4φ='…9˜MηαΜΟ¨V©ΛΤ·HLΡ>]QιS―i(R—R '’ˆˆ’²šμ2]φ΅Z«R 7― ]b{5^²»ΠΡl<€γεl«¨­(oHHW\Ps*ωnjž*»@•U’mό-=ΕΚ[†'Βn“Δf―χD Λrε,+P΅qkΓ)χζχŒΆΓΧυ0½%^ίOvvΒφ ˆΈ/*kλϋΔo‘ΥΦUwqwΛ§“3Χ‰HMDJγ4ήA‚ Rε•(oΙ([NDŽ—(?†Κτ· UΕΕ5†λώάϊΉZΉ˜΅1ٚ²©Š+^ύ’dW‘ω>Γ'½y @₯Τgθμ`yƒ§·ˆUόkSφ­ͺ?ε=Υχν^­mΈοŸˆΘ‘ΣΫΫ):’ϋΒH'wlœ€ψ€ϋ€"ΏΊώz=§¨^DJ;Ρm"ͺΣVΤΉX„₯ρ4>—cL&οnΡ₯ΉeDΥ)Χ(‹ˆΈόθ^Abe«Υ5)ωͺ""&*ΜΕYGΦe«Uόם]%DD|‘Σ€An±aΞΡbνΚ•ϋ•fC}£AkyΉ‘DΙͺDΕYΕ/ŸΣž{ ςΩέ†Sώ–χύtx8χπΠ|\mμϋu‹v#ςΰχ6Άν•Gh-ΊΉYJΓ”|o~ύΉmώ$Q:αœZMD½ΊI)ΨΟɍˆδΚ-ιΖwΔφs°CaΩ—-―όkΓ©x‘ΫΑχύΏ™ΦcΦΞ}jk‡Ί·“ρ{δ5§ ΜS]qŠΝ•²ςΈΖ+ΙΓύ›8.ΤΔ?ttͺJΥΧ; Vζ™θ1ξΑDδθ2-ΘpAŸ.釻§κ;ΕΉwίΜ§Œ0έ—Ο‰Šp6|ΉOj~-yυrξCD½œ#ˆˆΤ©†™{u‹ΆKο–uΩTςϊΑbœLM„£χRΝPΤm’—±΄mΏ,Λp D­jσής\›…±8εΟ_±Ψ+—ιAΧ€Α€ΞΧΧί²εζ.γΧΛΧή–7\`Οχ}lόΖ_‡Iάƒ”ξ£ΏΆζOaΞξJUΚuύ•νξk"vχ~‚ͺN­ΟZ‰ας~7'‰₯Τw ½‚φ)?Ϋ²9yp½ § δ“Χk’Ε\*>•―m2Cώ¬ηΊ}°½Ί’¨ςZι°••Czq+ ”Ωr½ν²\)‹/4MVwδ‹ό#VΪ+Nk^χeρ½ΏˆΈτ%eš’¦θεφΝb‘)‘Δ=ΏŸU;ώλͺΫD€Τό˜‘i˜ΤΓυΛW{Z|™›K΄₯gΚ‹ξeδηGϋ1[Κκ/ˆ“πνυΨ–Mμ±"LΎδŠŽˆ*Kj’Jˆˆι&μ“'OQQ]LGή"ςŽτΩqεΦ‹©%"΅\“rECDδΜ rΤΨΊςίμ’Β:mn‰ΦΪ4œβZlu€ψ€„α;sϊτrŽŽθΎb€k‹‹π9ΑC{eŠΫNVόX¬Ι1|―Ύ7OζώϊHAγοΥ'ώΔ ‡ α'tb<ϋΝ1\ύGDΔuž$ΆγΉB–eγ-œΧΫ釻[²•9•L±sμSžk†:¦μΥTδι‰(χ?Š[OΈυ!"βNšνŸΡ―te²<΅XGnΌ(αΒη?H·λ‰˜`gl*–Η½^ί?ΆιSž˜ώm@Dz½N§3όdψO§Σ•ί+‹ύ±έ@GvώbκaA‡acΔαpˆa"†apι@—ƒψθrΈ₯e]πc³ό'½^O†Αιt• 1ΆθμροιΡΏ’²ΝηώH‡:; ώ ώΑ Γ0¨xτ ρΟN—Ό=ΥόBόc0Ί\f!ώόΠες ρΠε ώ›…³ύπ¨ζβί ϋΐ£—eΤH£z1ό]΄ΰ‘μΑόjΗf•™ž£.Θ¬&§‹W ›Τ7>Η­ΠΉθυΝεzΝVYž@Χ:ο€ρy}Wρo‡1€Ξ•Yˆ–jJί¨ΡDδΰΰ€Š€ŽSŸV¦Σ#ώΩ΄š^oψ™Λεj΅ZTtXZ­–Λε2MΊ΅ζι†ψoάυo¨,½Ύi;ΐΙΩI‘¨Bu@‡₯P(ψ|Ύ•Τ―?ρ,σή½eέρ«««5 κ : ΅Z£R©Έ\σlΣ[ΧΝ6K¦ΧBAi©¬’’R§Γ­€ΠQθtΊςςŠ{χΚ\Ίu³™eܜτϊζoε7ώΦlσ“‘@₯Rλt:Œt9IŸ%^ε|eήŸυΑy<žƒΗΡΡ±›«+cυ"6½žΜ^αb[iΪ hά2°rK€ήΙΙIΟאΎώ ‘^―§ϊ·›ΟDo Έœω\£#ί₯[7ΧG'›=7œΕ7=g†,;ψ{όM.Dό[ 0o˜r[ίteθυ¦ Υ1ΦfΒ0ŒΎΙϊC;ΰΎЍΗ\¦³ŽΖ€1έΌsί$ϋ-Ί«†„jςEvˆV ‚&}£€‘ΗΟ49`šD>Ύ;ΰώα1D†α/,{JΠ°ΐ’«Y?]Κ“ί½«tθαιυxŸ'GŒυq6oΧXδˆyπ“ΩΨ~ΓMώfΓώM3ρo½Πθ2@σξ»υ―oXΉ~Πlzτώ,Ιώ³gχ‘[*"'wΗ΅Šς»yΏέΝΛΉ6vώΛ£slφ}ͺΫΗwμ©ΈŽˆ\έ$ΟΛJΞ»‘ίΟUK ιΖxςΥΦόCCΕGσ―]ΏšWΧ7¨aiUW² κ§°ώbgλέ6–Ε–eμϊfj"“‡Gw­ΡݐšUΉGφ~‘qη§ΤΒ1“ϋ6χΎ§T’εvšτς„§s""eAϊžoNη–0Δ0ޱχo{ώ.ΑόΌv#?ϋmH`}l+ndiIϊ”˜Οα΄½Ψw>~πf W>mΦ³ύ»;‘2?;χž½^Α0 ‡©’_ώqoVΉΦΉwLά€ρώ""eαΉύί']ΟΩθRŸΉz˜'ˆY/΄ρψΏιΗ†sώ'CοŸν@γ€α.Λf—Υ»,n0οϊ£PO­r~άΏoΘ˜'{πκ_Gυλ™ρKy•¦Ža¬wU7ΞfΙςŠ5e¨§ρ5—Ηο΄²ΎΌTN ηώYΜίω‰πގ7ςr½SΧ―·aqŠœ_¨cz„ δ1ν(φνσηοhΙk܌‰Ζ'rύίIEονΏ¦lΈn―"λόuγρβL׏υ»τŠ~y‚τγo3σΣΉ3Πό; ˜ϊφHΣ?ζk<mΩSe¬](€ψ·‘ίV5Ώά±6“^Am˜s“Œ[$iΤ³Έqύr""5χΥτ7 κˆρΥΣbΎx@Ρ₯³²†+ΩΜΏ[hh@R^ξυΛu}‰¨"λ’TKnOτkξφVΕ–ζεUσ˜d€e!»…†8\ϋMΛ ©όγZ)1ό~Qύ\,Η*ΘL/ϋ£°Šρ4Ν‘¦‰N¦ ΝΎΐϊ”ˆZ-΄ #MYdy³€Ε`UmUQa‘TZx« DZz·¨ΈͺŽˆβ±­¨©ͺV1δΪ]$lό{‘o.•Yήύnsώ.ΔάάλωYEuώŽT~=£Θ3tπγ-vΪlΞΆΊ²Š!§»°Ρ§ΰ‰zvgYύe{ΥΥ -Γτυΰ5^œ‡§CΥ岆6 ώ†ΜjF,²ηώ­χΤ[n4ΌΝΪ`>cmζ^Aƒΐ˜‘₯™»Ύϊρ· -q»υ|ά··8jp΄γ•}{.έ#¦ΉΫχL½ά&Ώ7ƚιμζ/ οΝ½žχΫeιTqŸ’_/K‰ραΧ|ϊ³š­–©%††Χ΄Œω…yfηξ-ƒƒΟηΓ0Ης‹ΏβcΦγ'«ΧXΛ~τώ›m4zέ<ϋ›»ψŸαpš»Š±Υ θ’*ώσύι+•ށ£βfŽι#4η—ζ1Œρϊ=«ƒ†©ͺ,―βˆ…ΏQTΘtυοmΕόέ‚ž tΜΟΉzυζsΒΫ½Λ0~Q=9œφ»‡ΐaξUΘ+8œmyEΓPύυ‰n!—ΉSQV‘ε4ΊΡ‘\ZΙ »»’΅ΏEκ“Ε—4Χ0‡ψ·έ°šύ6ZΦ.ϋΛNtɍ;Zβ|Ϊ_h–|5²{ςϊc©υ7ϊτε^ώ-/3M6θiO³ωI³ΣdDΔο©c?·ΎΔܜky—Έ7dΔG θΑ΄·Ψ=ϊ:₯έ+ΘΎ,2Κ¬5ΧΏͺfτ cΌ;ΡΕ/°'“s'/νΊ*$Μμ+jo]Θ©Φ3ξ}Ε=ΜΎ`Φβλd,nIcρΔό9ώΰo³ς¦ί‘DMn¬€&Y‘ᛉ8υOπΐ<π°ςptrαΥί.­­±V‘wfΗ‘\Q]JΫܝƒF p#*9ωεwιRγ{λ€»v₯ή%γΈx+η/ οΝ₯Š΄“™wΙ!`@?·φΫ1`t”QΙΡoŽώzΟψ^ε©»]QιυŒα{β‰ςŒ&vΦW]:”xζΆψ’²ΰ§]ίgΘυ\aΓ}©q¦X+ e5ΏŒ?’‡ΪHΣ iξχ5šjM’zZPr~ϋΖ£EZ«Ογ^=ΈuŠ’Ϋεu=%aΒάμ*“gΠΤ3PhνΚΒ€„―“₯uDδΤ]$€ͺ»ε*rκ¦JΙ¬ΊdΩ΄Η[9yΦ֍Grꈸ}gž1ΠΩΕ-½°kׁkUD\WOa]eIΉΚQ;”{&ωš_άίfG—’ΈΌΛ™•uDΞξ^ݝUε₯•Κ:"χ Y _ΨΓz΅ΉŽ«αΙ­©γΎΝM†ΑΓώVOε…ύMlαE0η=rΖ[.?Ή[Tp»άUδλσΔ “‡ κΜ{μΔΩί Ι•Χάε.½&-Yθαbκ•Β[₯χΘ΅wΔπqΟFω–ώ€P©ύοjΕόέφεζ\Σ:E†ΊΨ8v³-―ηˆyKzO>ž}λφ²rWoΙΨQ“Gϋ^ί~ŠΈNΎ¦&”L[΄¬ί…³™·oί‘έ-ηzψτ ?ρΜθώ~Ξ6ςήζθ55σ·Πϋg;`s`έ}€ΞL™ωεΗ;sΉη.›δx?tηϋχ·ύΔφφŠgόΪΧYmα•[>½|Zh+ χίR΅Zύޞζώz/Ίϋ˜όχ‹yZFπΔ°Ύ<;Θο|ΑΆŸ*Ό&Ύ±ψ™ž ―ΦήΜΌ\AΞƒό½νΝΝƒ±vΧ€ω+Έτ―ΥΥj~…ΥΧ]‹Ώλϋ‰σ7κ¨GΔ ~vλω?ιΕ­+9Ύχ‡ΜΫε5΅T+/ΟΟψα£―3ο‘(jHŸΦ.‡MΚ΄>ψΞ; 4Χυgί.€Ž‘όόφνΗoW)TDNγF?nΗΓv―˜ι3Jχ$fdξό,Σ,xέΓ_œώ|ž½–c3h¬N€ψoo# εΪΗ₯ΧYΰTW§ψiς„!BϋΞΌϋ i―…ŽΎώϋΝβ’ͺ:»―»Θ―o?a[FΪПlα-Έτ―-PiΠ‘»¬†KZjυ šΪΩCS:T0±ψΏ_5Žf<τ˜GόwΦ5`wΈρρˆ@όβ€ψΔ?<<π%Ÿ}^™IENDB`‚enum_tools-0.12.0/doc-source/index.rst000066400000000000000000000107041460302440600176630ustar00rootroot00000000000000============ Enum Tools ============ .. start short_desc .. documentation-summary:: :meta: .. end short_desc .. .. code-block:: python .. class Tools(Enum): Hammer = "πŸ”¨" Spanner = "πŸ”§" Scissors = "βœ‚οΈ" .. start shields .. only:: html .. list-table:: :stub-columns: 1 :widths: 10 90 * - Docs - |docs| |docs_check| * - Tests - |actions_linux| |actions_windows| |actions_macos| |coveralls| * - PyPI - |pypi-version| |supported-versions| |supported-implementations| |wheel| * - Anaconda - |conda-version| |conda-platform| * - Activity - |commits-latest| |commits-since| |maintained| |pypi-downloads| * - QA - |codefactor| |actions_flake8| |actions_mypy| * - Other - |license| |language| |requires| .. |docs| rtfd-shield:: :project: enum-tools :alt: Documentation Build Status .. |docs_check| actions-shield:: :workflow: Docs Check :alt: Docs Check Status .. |actions_linux| actions-shield:: :workflow: Linux :alt: Linux Test Status .. |actions_windows| actions-shield:: :workflow: Windows :alt: Windows Test Status .. |actions_macos| actions-shield:: :workflow: macOS :alt: macOS Test Status .. |actions_flake8| actions-shield:: :workflow: Flake8 :alt: Flake8 Status .. |actions_mypy| actions-shield:: :workflow: mypy :alt: mypy status .. |requires| image:: https://dependency-dash.repo-helper.uk/github/domdfcoding/enum_tools/badge.svg :target: https://dependency-dash.repo-helper.uk/github/domdfcoding/enum_tools/ :alt: Requirements Status .. |coveralls| coveralls-shield:: :alt: Coverage .. |codefactor| codefactor-shield:: :alt: CodeFactor Grade .. |pypi-version| pypi-shield:: :project: enum_tools :version: :alt: PyPI - Package Version .. |supported-versions| pypi-shield:: :project: enum_tools :py-versions: :alt: PyPI - Supported Python Versions .. |supported-implementations| pypi-shield:: :project: enum_tools :implementations: :alt: PyPI - Supported Implementations .. |wheel| pypi-shield:: :project: enum_tools :wheel: :alt: PyPI - Wheel .. |conda-version| image:: https://img.shields.io/conda/v/conda-forge/enum_tools?logo=anaconda :target: https://anaconda.org/conda-forge/enum_tools :alt: Conda - Package Version .. |conda-platform| image:: https://img.shields.io/conda/pn/conda-forge/enum_tools?label=conda%7Cplatform :target: https://anaconda.org/conda-forge/enum_tools :alt: Conda - Platform .. |license| github-shield:: :license: :alt: License .. |language| github-shield:: :top-language: :alt: GitHub top language .. |commits-since| github-shield:: :commits-since: v0.12.0 :alt: GitHub commits since tagged version .. |commits-latest| github-shield:: :last-commit: :alt: GitHub last commit .. |maintained| maintained-shield:: 2024 :alt: Maintenance .. |pypi-downloads| pypi-shield:: :project: enum_tools :downloads: month :alt: PyPI - Downloads .. end shields Overview ------------ .. latex-section:: This library provides the following: #. :mod:`enum_tools.autoenum` -- A `Sphinx `_ extension to document Enums better than :rst:dir:`autoclass` can currently. #. :deco:`enum_tools.documentation.document_enum` -- A decorator to add docstrings to :class:`~enum.Enum` members from a comment at the end of the line. #. :mod:`enum_tools.custom_enums` -- Additional :class:`~enum.Enum` classes with different functionality. Installation -------------- .. start installation .. installation:: enum_tools :pypi: :github: :anaconda: :conda-channels: conda-forge .. end installation Contents ------------ .. html-section:: .. toctree:: :hidden: Home .. toctree:: :maxdepth: 3 :glob: api/* .. only:: html .. toctree:: :maxdepth: 3 :glob: contributing Source license .. sidebar-links:: :caption: Links :github: :pypi: enum_tools .. start links .. only:: html View the :ref:`Function Index ` or browse the `Source Code <_modules/index.html>`__. :github:repo:`Browse the GitHub Repository ` Further Reading ----------------------- .. html-section:: .. only:: html * https://docs.python.org/3/library/enum.html * `Is it possible to define a class constant inside an Enum? `_ * `Enums with Attributes `_ * `When should I subclass EnumMeta instead of Enum? `_ enum_tools-0.12.0/doc-source/license.rst000066400000000000000000000002301460302440600201670ustar00rootroot00000000000000========= License ========= ``enum_tools`` is licensed under the :choosealicense:`LGPL-3.0` .. license-info:: LGPL-3.0 .. license:: :py: enum_tools enum_tools-0.12.0/doc-source/not-found.png000066400000000000000000001352371460302440600204520ustar00rootroot00000000000000‰PNG  IHDR\r¨f'ΈzTXtRaw profile type exifxΪ­œi’7’…γsμp«Ωά`Ž?ίC)J’š”ΝˆM»*3w‹ΓƒξόΟ_χ_όΧS4—K³Ϊkυό—{ξqπσŸϊϋ3ψόώόφ_ψϊσOίwίωšψš>?hγλ]ƒο—?ήπν3Βόσχ}ύ$ΪΧ…Ύ}ςΧ“>9ς—ύγ"ω~ό|?δ― υσωKνΦ~\ꌟ―λλ…o)_ΏS{—ώ~ύχγ7rc—vαU)Ζ“BςοΟόYAϊόό.ό“ιuό|€”ŠγKHίξ• ωΣνύ±Α?nΠO7ίύuχiσγψϊ~ϊΛ^ΦoQ«?A(?ίό·Ε?|pϊΎ’ψ—Œ˜ώv;_ΏοέvοωάέΘ•­_υ=ήexαdΛΣ{[εWγwαονύκό2?ό"8Ϋ/?ω΅B‘¨\rΨa„ΞϋΊΒb‰9žΨψγ",ϊž₯{\DŒ(κWΈ±₯žv2"·βq„.§ψ}-α}nŸ·‚ρΙ;πΈXΰ-ψΛύ§ώ›_ξή₯- ήΎολŠΚ\–‘ΘιO^E@ΒύŠ[yόνΧχ’υ?6ΑςΆΩΈΑαη糄?r+½8'^Wψϊ©ŠΰΪώΊ[Δgπ•„5ψc }44XyL9N"J‰›EƜREJ†Οζ=-ΌΧΖkΤ·Α&QRMΨτ4VΞ…όiΩΘ‘QRΙ₯”ZZ1Wz5Υ\K­΅Uάh©εVZm­YλmX²lΕͺ53λ6zμ ,½φΦ­χ>Ftƒ\kπϊΑwfœiζYfmΪμs,gεUV]mΩκkμΈΣ&vέmΫξ{œΰHqς)§žvμτ3.ΉvΣΝ·άzΫ΅Ϋοψ΅―¨ώνΧΏˆZψŠZ|‘λΪχ¨ρ]ΧΪ·KΑIQ̈X́ˆ7E€„ŽŠ™·sTδ3ί£π,²Θ’ΨΈ1B˜Oˆε†ο±ϋ#rΏ7Wμ·β9§ΠύDΞΊΏΗν'QΫβΉυ"φ©Bν©OT??6\΄!RψuΏΣ\‘Œ[ 5³Špςθmφ»χ‘ϊvώ•[]ΐΰν`c-₯΅[ηυs°ΎλΉ%YeS@°E"t_Σn1Λ—YκXν:Ώ@Τ[δŽΚ -κaί39rAΙ †³;μNi|Șν8)ΨvΩ n›Ϋ;ξͺϊ+ΕαΊ³ZXeξ³On mέ•άœΓNλ¬άΧfλΆπ<΅όή +šZxeηo “ο₯Ξm7°’ΩΝ‹ ͺmήQZšlŠ‚Ήγl©¬bΛvˆ‡PΥ•άMγμrΈΝpɝvήGŸΈ;Ψό7ΏΊίxaαΆ<·Λ§Δ0o¨—ΤU§Ak₯Sl7wœb„iuά?ΩζΪqπu°μδ8Ζ ©Iƒ]η;ΜΖ^λΤΘ$·NΏ7-Κ4τuΉΗ½ΨΥΕ~²ΣlMΫ'ψλΣ"gΦ;j™‰xŽc‘²¨z \RΕqΪτ7s‘Κ™m€k‘MccCΪ·—Ωϋ⡉eΟrWšχ$ΎMυy­₯ε·5ϊΘlv<~τiqJ?^ωšΙιChΪ G"mάs3;²Α'»;+}œά%ž‘|✠?Λ—:UQΡqsΝYΪ<ώH5²΄Κφqq½2ΨΘ6ΦrδΤΝN©ΤσΜΈ°£bj”‘eŠ–zλ$Ν²RE΄υ*B ”K,(,·kY„”=ΚvΟρJ»» ž:©“Ψ•¨ ξžl υ¬£[I£ ?Wρ uHm€Ω¬.΄ ’₯ΩΩ„Χκ| ‚X\~Ϊm0ˆΔŸ”ύα•\Σ7 'ϋΎBθ•Έ pδΌ-zM½ώ–6ΩS !8CυšŽηλΙA[Κ%@ΎΛά©€ΚΌO”8š@οŠδ {Dn’ΦΐΔ,”2a˜‡χ(ٟyJ6O‘M;››%vΠήΒ™Θ!p+B‘σ9ΰ³ώ·Ψ`R“π(ϊ¨qφθν¦?μΎ|Π­ΨΕ‰LδN}\Θ§VΖ!‡Iί=›()…R'χΓ‹,`b«r’c±Ύ`κ1Z&H,ΨN)KPΡΈρΈε²ΤN ΥX›B6&n ,ήƒrtž@WbI@δYZ½ς!΄Α-S`πΛIƒ•Γ qCkK•]υς}₯MANYFκξ‘1H„C£—‡&DαΧ_έί~²ΣΔbίΐ Q³Γ`χ΄#NZ=‚¨¬²ΰε<ŸNY½―‘kΔ:²-AQIh2Ά½Dpα(9»‘LΎδο\™ "Ξά Έx”"1P‘»ŽΜChΖvFͺ1ΗΖψ\ !ίN]dΎ·w7(†Ύx1D°SO#oaC‘ͺη†JαΪΌ” d"r€]ίHˆόHw¨WPmΓk²"t"w% ƒάΈϋΥ<Π°aši¬=Oou\n}³*κΚ7•ό1ΔfuYνΈΨηΊqωΨ+xSX·1ΰ&Θ”,37’Φσ=xP¨cWΫT$Ι|CψŠPΝ±fy*M⁦Dΐι”Q"x$ζ­ͺ»΄fŸa”4Νςτ²’ΰnοNƒΜ’>’i’—žθ`߈wΣύA/&u΅)KΫD°>@ι«Ί½Λ`8žΛ ,-©4Ψ"‡XšΥ—߁ψI„ Ώ₯kίZ ςwQεQ"Δapδ¦R=’i&( D uϊMΌα· —‘%+][ `”CvZnΓ(΄±ί&_p9ψ1tΌΘCͺ¦‘ D4ά5ξ[²ήΝKo0„JžΫΝJΨAύ:ΫK€όArHkl‘]]ΔK°Ÿ,ΔΞ`΅0JγΛ5‘έξϊ ΐ‚‹#uήt!50ζIe­3Β¨oβη2jj@yA‰eM½²Μ<ήυ¨]”„•=“8C#'Θ,½Τ” Ν²3ή9Kjβ‘S9~7€~£p²³…Bσ8MΚfτ•zˆ441*'3‹Έˆ$©:D*\ˆ€[Ψm9Έωε8eAP}*D§΅ςD‘g—PXΐ@€Γw•q΅EE6–ΐ½₯’D駃!%‰>ŽŠΛ΄aγPΒFzHd--€CθZd^Δ|ΟR¨ιη!Αš1}Ψ^$@u@cά5ς€G έ;±UlΥRΰ·ΐλ₯Š£4Γ£ΰόSδ‰Μ`w(}δΟ­"+«7’&z₯dGRr&uoώ&㣜΅Lqς‚IΨAΖL ΛCΰϊΙwLM τ―5$J«S΄m₯~kΨ2R "ZΉ\‚Ky•~Ώ-ι6Ήͺ Qνx'΅-ΤaO…€ ή₯¬ϋ¬»>dΞΖγl=Šw‰L $,ε‘9ΚΪwΊ}َ$ΊDψΒΛ<ϊ˜ ΦΰΩcP Φτ„ιhΨΆψc"Ρo”Ž †μ+8fύμPbθ6P‘ΙGQ™ϋ TΠ.Dθˆ„|ξ(σp;˜β¨W*œFέζ-΄λ`ΏvCΘ^0Ά$”Βs(ΊΓrρ=H(uX ρ mrθŸ{Uξ€+ΊΔμΫ`½Ψz+,{?X|! FFŠvΜιE₯ΜλΨς<Ψι,*Θ¦b:L’Ι>¨ƒ¨–|: |0:—:‡“Ωφα]€ͺa»sS!Ωδ%‚ΣZΩ`6И cΓν•‹W!Kΐ=°yj%ην ƒHp²]’UŸ ŒΛ=απ@­μΧhψAνΧ‘Ÿ³Γ…-Σ~UŒEˆGέϊοU9ε5q… ύ‘CMτ.7‰‘9Θ]dπˆna%€2uYяΰίΑρc‚b@B€2­Ζν+όˆδ,Γ~© U¦‰)C7!—rg‹Ns Ε:"ŠP@ΎXw4RsΘή<χ Ο‹’IΨ€ΓΥOΒ‚εμ•›)^8’>APGJέ€x\μ9²ˆΪ$Β¬ΩρFΓίΐΎη(…ΔΆ`—Xzρ8”εΚP(λdˆVJRΤcB3τ¨»K=)9Α/θ¨ J ͺέ!mEς…ΐž q`ΕU†$1-W”?―ƒ:Β`i‹Ž ζ"θœ‰€nM©Bΐ¬HjJ±‚ήy Ρ½pΗAΈ‹¬Ψmp‚οώQβ £ ξ:·OnLn²Ώ–ž@Ρhl•΄πή»žΙ¦B‘]ώ €tπλπL@f#ŸΤϊΎ»P#ΑΨ†@Γ7ΚΉςRΈε€πDœ ₯³ΉηcXσjqΒ“€η‡ΌΗ ZλΌΡ‹?/εκ€u`ύΨέΥ{šαS°CΆ™ήgη(l |’Œ‘s5Q^Mθ“ͺC ž*;e t>’0α?ͺzF=φ–€ΝuŸΕ; IόΑ5±—^6‹ |Φ퍩zλvΜοhrŽdΕ+”αΟ‰]'Q3rIΜ3 ϋ‹qΕσ@|J’‡X+—ίϊβϋPe&uΞ.7XIύ‹d¨—KΑ¬@2]‘Ð`A[vΘ³B^aM‰?πΆIDΜw ήwΤ`αΥΥYžX£ŽαUVRsd4šŸa+‘Š,ΙκY2Θj‹6'ΑR³Λπ±νωΡρs(Ζ^Q˜Δ})°V’ο‹ PΏKKBSα͘ iŽg>ω‰`Φα>Ύ^ LΊΔΞύ€ΞF°Κ6’ŒLHήφΟρφ,­!»λ)δά’`R‘VT˜JΔ€#cG¬ΐ—1H,’.Β’Ž d4 ˆ0M’r˜1‡Lˆ`ΈΠψΑ‡&0jͺ ₯„ ΌΥ(‚‘b~wκc&œOϊ !S―‘PΠϋSŽ'ΨSΘ‘ʞUe!J/ΏΦšC€¨p’ΆC#Έtμ§[¬ 7„ˆκ` Xe›ρΉ.Pν‘Λ‘Εp#+ 1N+Ήj(U&ΌDΔ}?Ψ₯’²Pψ1Ι#ή@ub_Βώ)&ΉΏ|/“ΤβA&IΩ”‡@ ²”w³…Ό‘―”P@HιVΥ½EŒΎ ƞς—²αΞ &@,πSΔθj2ϋBΰ”τ κ Θβxˆ λԐΗ;¨³‰ˆ€Β.w§Ž—Ώκ±Qχp dšΆΜšα>2kxΌ03ŠΤFmά ί»§Έ!«­>f‚5ŸFς ‰€‹Tρ V“ΖhsίλR‚x«\†ΊcΗ₯].€VPΏ Υ‹pζ}o°?¦§hˆΆ PΉ ΐ` χ"ά\hlU>…|C+ΜΞa>^[D(‘Nl-=ψ9y†ϊ1~?6BυR·ΙΡ—ΞΌκ πnCe\ςEd@e‡}¨ΰo–)λϊ6μςš$χζ N]ˆά#—ΪŠR0c°J5v4D›x‘ƒ;”=&± ε$nδ+»Ά‘-J2)ƒo“Nn„IOjsQΘ©ͺV*ψOŠξΎ ΓΩΎFeδΰι’£Α?l›ΐ „ νβ˜Ϋ@“ΑA˜%2o½ΰ†7όρΥ €_ΫΨOOj9œC‚bΰμη˜P@U}kgx?t5λΛΧ—ΉPϊ €dΖ€©#ΊΜΕW„lT %)Ώl³e@4₯Š›€Ζ1{:mAR WΆ¬9δΰρŠBόˆj…#ψdΡδζή‹;Ε»ŽΈƒΨ'{ŸΌΊ‰zτ:Ώ‹ωVΜ$|ΊTP λ]HqE€ꟍ 8<6‘ ’ίΕoH8.΅“Υ`Θͺvτ•3πa–QΡιHqβΤ؏υ0u!呍DΔ“;Ύ!’ ϋ$UxώΒψ+LT­Ε(a|Ζ($φ[θ―˜ΡsSΆΊN„'6 ut»G CκΏO‡I‘|*q.ΉG ΑΞ#Ÿ  ZΓ–e@ ΨXiΨE‚„ΌΓν¨„σ2εoΐ8p.Θκ`$ΈΙ±P’ι$θ}%©Χ8W'Η΅³E’ϊrqβ•αYL7±μͺΛ {½²»ΙAΤήͺ‘rΫ~>RujRδ™=|X‰”od§ιΤ ^ΑΣ'o³πω]ν–¬­Vϋi«λLI!‰Ά/ωLυ†ν|Έ%Ω‘Nͺ+xΌ.€f(= n’C'ƒƒzΒJύ²ΚκͺΑ0‚„|˜()Όl“δ.0:V'V€πΟ‡β-@΄K‰™έ¬Γu@ΓEg[u£€0Vΐ AYƈR5―Ώ’jՌηb)yg&uΜb„ίγμF› €Hˆ-Δρ΅Ζx%Π$¨7§ŽKœ Ϋ(Hς‚‘ŒMΩρΎ{RŒk‚Χ5³ vVύ 9γAFR»`Yžtδ†$™•ίή›ΐς±jΥ‘KŽδπΣ”H1'/7ΓήrCκF6œš?BA…0ΞΔr’ΠXΓ¦©ώ1’¨©K)D~¦ΰ՝κχ@$x`~b$u4 „,ββrΘ-Td"zΙΨ€˜a/#£Qi;o § γ^w‚ς\ΈS΄. ΊΣ|τ8뇉VPgθν7¨ϋΔBΡΈl}^ Ί©CΗΨάΨV·¦CΕαΤ«l!`KLΒ±Iύt<†Νp8₯ΑnδΠ!Ϊ0E•ΎΘRα¨°bΌKΧΆΞuQƒ’α‹ξΖ֐Ε{εGΦzγΈ°Vg²ιC™γž)V»Ή$o–D„Π‘υQ¦˜=\-'JEB^ϋ£ΎmΔχ%*αi™:ΆΓ™_Πσΰžσ€˜E΅vŒ3BΡιχ+ Mή}±Βp& ‰?.±Ω¨S—t0EGΗƒcΑΦDΰ·τ R-ΈΰJ hάρ‰6($d“π'l85Dˆ-¨>SE^–Q4{{H±cSŽ„k–Ο6hˆ¬άσΣ΄Ιι,ζ‘½TΗX3!ψΫς,,f%h8±ύ©Ά―ιH]θ¬Γ©>œή ¦ς°ͺ‘¦Βς@ WΡJ†šIΌ”p7ΕΝ%}Τ)’ ό²άΚ„ͺqΰ'H §ΊZ€h ƒS ~‘ύ―ΎΊb-‚Τ#ŒΉœSP“V*Ήb’Εϋφν»:#ʝ(«αΉp;ά~F„Τ† Τw–.OžΪ„λi£jΒ‚ΊF•v˜ –B°ΐ^uŠ…%fδρE|5ŸϊƜŸΞ¦6Ωu±Υ"1˜^P¦μ™ι£f-šŸŸJ’ϋIηΖ¨)§c›‹ΥOι"t„Α#υŒ+j¨0μ…ζ6κλ+@ξΆκU›{Ισίπ!HΒτΊ@“$2[ή}%nT~O'³ Μ‘ΜΉχω¦ut,; »P«ΰ5—V—$Ζlל£΄οΒΆwτO /’Ήη”JuX˜ά­WC|bŠBΆ!9`C–΄}Ξ3±2_΅1XΔ‹βτ یEJˆpBΐ•[ΤΩBλN”Xuχu2ΣjDkΜμβAIXu-‘κOI’±ψ:V žΠ)|Ή…’mΫM΅ˆΠ¬‚eΥΠm₯’HšuΨδ#ά…τFvM)Ž#Σ¨ξ0χ›,ͺS ίΪu^§€h*δΎ‡:μ‘>”ˆP Χ9Ωώœfk`h¦ I§Π Ω—₯F¨±ΦΑ6V„Mͺh‘ήΥΧ‘,¨₯ω¦+€,β κψ“WΗ“[‚PˆT-0]‡wΘ{uΠ—Τ5ΜΛ=;nθ·‡bςGΩ―I/χΗ—Έp¦iΦR¨4ΤΑŠšXMφ~θΠͺ“ς|QV“mό‚—Νˆ4ΩήΥϊ΅r†Ό}ZY‡^θOΓΠEvψ ”Π}₯#-`ά܏,ΉjΩ½^˜z+0ιο„©³δ!Lˆ›£>Ρλ# ²Ι4uκ‚*Ν‰Ψ₯F„Šαx²SfΚkκB5°#([ΰ-bάW#VπœΧ§†ΩΔ{6\-$š·ΞΠIαsLΫ·ΤKIΎ„9‰N©Q) /βά•XθΞːxΣ'ΏSZY*₯ΰš!Nt΄‰£ζ‚`n‰ιN0̐cw>%β2pX„t DJ„“„Ϊ(V…$°ORp†v€HΗ%Zχ$b$Ο‡bΧ‡p`©MΡAε]oj…FΉ2’KT‹Ξ„ΡΌ£θ’ŽΫS‘Ω£‹o8RγY0+Θg€ι`~Ξ&©IΙ1,P±Ί`eŸ©ΗέQέiπ§X‘Ϋδ›™t:‚©ΗS ΝjLˆ”ΟgΪεužIyΠΨ‚z&Ϊ*t+%B–Ι’TnFγ†j#XŸ-kZP―ψ‘­6ΒV6:IΩπK‹³ΎD>z5uΥŸ„]€<Ξw)gBΫ>ϊ‰·AzΤ7#}H:Κ’Τ`PΕ H^Ί£ήΑI:Χ-‘z νˆcjδj-G±Άά=’Όθ€ηjΟλ(D €`*-cU–‘Y:₯$˜ Ο˜„ ΤζΆ!0bΠΔuΓDΙsDΏP˜ {F–+ι`ζ~oΰεσ•­“&ΧPp ]€υšBrΒαa_`“­C 1HΪςkZΈ8ϋiv7!™4}†ˆΚΎRE°-]6 WEυgi½ cΓ7R‰%ΨΨDΗNs£έΛ―:€$™AՁ+ΘHT yά" HS€―‘ΐ=P»&ΆΰpΜ> ojŒab€ΙΘ γN(J@Ϊ‘ΑκμεMΌ¨Δ‘cj{#~ m£†¬ΡEGί@/†ULP2β']vκ‚βqjl¨aLrΙPφ―…¨©/'v;”XΠ< jqς Ώq#(Œο%ΟΑ‰Xς‘γs€",V1—pT^0ΗzΙN* šδΘΌ„ :“1ƒE„畝@€LuέA.[γόŒόΧL!rC3=@]ˆ δδΐ‰€nˆ,Κ•Ϊ@Ύλθ>χ#±—άͺEΣƒ° [„ρkθ1ΣXͺ½1€ β°‹}¦™4|φS¬δ˜½,NΑ7W;ΠJξ‡UΒΠΈ¬%•&?ΥpdΝl₯ω Z}Η¬B"Ή ¦ k|ƒ―9Χ_―A£±XΈ|Έηe`=%šς–nΒΆθδΡ8(΄‚bΤάƒ¦1£¦^q·…–œžžhΪ:u2’†UΖQ&ˆ=:’³ψ6tŒίBΡ8(σ °Ά –RΉΙψ騀hX^#U˜ί5‘ό ±Ό£σUΝβ0`•:šS§f€›Ώ}GΝ( F&&k– hQ δζD;9p;?utŒUΧa/ΕBNf^М zaM•,θH¦ŒLΑ6LϊΡA]œV‰“\†}’d2NΑΠΙι)n,€΄ήd,`Ο\UΟx’ΨEΚ%’VQEΐζΡ 2F>W™³ŒΦ’ΐΝ8*ƒ£±œs@GΧ±i2 ŸηΪRρUƒ(ΨΛΦέΘδa‘d•vAQPaδx8ž i"8A™›ΤDlRΝ!Οψ5WCΣkhbjxμ"§¨ιg¨‹žfςŠ$8:€gŒdDvΧτ›Ύ’αΜΗ(6I\ ‰°†,«YΜ½5eΘΤ 40ί4ςϊT«Ζ£Ε–'Ω½Cψƒ+ˆ’sWΤΔ‡H₯HεΜD6²εςωαJ뱌Œ½DΜj΄Ϋ“±–³S„κο«Q7ŸI@ «Pΐ˜aκ’Cywζ€ώΥ›ΚηΊ:#Βεύ5%μκ πΤ―ΊžHψBSXuΌ5_PAΚ›ί|5Άτ …\•W’α§OΨ―Ή]˧ϟp‘ς*[Κuρjοšά_XG2ψu>,¬g0ΠΩ(rOHI{Π΅Šqή Ώš”$8·Λ΅@4XQΡΓ ―FφΰϊHex{ ΰ¨£s‰eδΓφ²ΠœK΄}@όΕŒˆ―λI(a@Q󱲋겷χκα4Ψ=l¦F ΆλΝ3ϋΆ―Ξζ†mמυš3•φν)Λλu¬›NΛg_°ΘT³=z5ΑΡx–υ†14„€VHrbY±ΩK33°ΕΥ—@Ψ8ΐ;:…7p…nƒ’GΔιΑXj j+鎻 ‚ΒsΥόέΥ(֐I‘τ[ΒΨ7 C·7₯§0Xwi*‹Ÿκ1ŒH‘Ϋ”ΡΤδmκξ_ΌιΝsŒE: )πΕG‘¬‰„φ@U“ ¨Ϋ˜IOΡΔ‡ζ―mL`FN ν­λξΠ*SΓj|Σ7½Zνlb/Ή£Ÿ™¨ςAu|ή±[aΔκΑ'ΉˆΉ«²™**Ό·a7‘Οκώκ„ό™|ˆ†'³›ΊΚlƒίhΉ₯§YPzNO}lDƒLΦξ™~=^IΗΝH< ν—Kά±.›ΫU€§Ύžk–ί1žΗuΚ^‡b)ŸP!ιlΝ ςv6k^{ ›Τ Ο–&Νπτ―Lt†γΏyήεϋˆb‘γ“΅Žˆw"³±νβψŠ{σφzΧQͺŒTBP’ΚtHΞ'ςTσ™MšΥ‰°¦c4ω¬™ω»]ͺu«™«±ζΈΥˆί;κ‘° <α6α¨i\φR‡ΣΤθΌ <πŸi%ο[κCϊζ MFκŒI“ZW“§ω <Ζ]Q‘Έ^…2Χe™&:qEηB ηχƒ¨?{X—<”,W„Αgϋ£K’ύFlkšaΕh±$²`/¦;7‘ … T2 Ηϊγ‘^―~J;’ν0€tΜΡsLgΎqBiͺs­‰ΆζΨP–Œœ'Φ„·ΈY'θ,λΗϋ$ν‡νPΙΐΫWηπ€ψΩΊUΜξή4ŒvΛ¬ͺinB­^εΤ ηΑ끋9`ΑΔ$!Π{ƒž4Ξ†ZS^ͺ bjή³Mδε'R9οƒRrlΓTkAη5¬γΔ¨T\špNΟE3Ϋωσ0m%?L―Y p±εKγY3˜ο‰šŽΞ0ƒΒZ―?“5­>)εW€όVΙ–UJοΘ¦ŽΊHΪa„ύΉκgu ΰ{ι ‚Ν‹“§Δƒ\¦n\Nι8λJώx VγΦ XI]'yAΐ0#σP2MΘ­–BφωΨΤ‰α'άH€6u£ z ΌΤ 0€gDΞ³"οY ,hFΒk ΠΈyoΝP€ΰΐ^υ°¦,BδU ά—bŠ6αΧFωώλjv_εΜ¦ΕUΔ¦y`>zJ¨QchΒbνXtœσ―Α`*ŠTϋ•Vα‹Α$?πύκQ6o*ΖT΄2ˆQ«hVΫβξ+3Š8ƒΧs„;2cθλ«Џž8ΈͺFΣ₯IMΜςΑB»ΧθΥι³aκ~Ν.,0v}¨}Α†l5ο3d+nΏ±yό‘ψ¬δ₯>€Ϋ0"ο؎άΠXΊ^ξτϊw"θ)@Σΰπ‘έ3Υ7ΐƒϊcm(›PΔzπL-WŽπs]r[_Υ΄Ae=—©œd¨υΤ!—ˆ…Π±ΒΥƒοΨηLξΓW9˜ήΩAΖΉD=+ͺηξ¦£ e”ZπΈkΆΎΐ‘ΐ"ψΦAή _μ©ο­ΩΩόyατι¨όι‘HAΕ…HEIθ!ΌU—z·Uc oΪBG―Ι‘Nyκ―`&^ +ξΰojΤ³ ˜SU^NΟ ΤΧDυΰΔŒZP=ŸYΧη 6Ε·½¦œό{:γ²?8έΟσ’ͺ:ΫCE;ιΑ–Œμ]³j: ΚΛβσ=ΐI¦†…«iΨgH·Ntφ€‰ΰ{›š[ΌJ3S„-―C£ιBν±+ •αΔί>s]|a:ο•Œ‚_4ΆΚΞx`[σ3zκhˆr)~›ςƒ‡¬ΌοΑζppμΞpΏ`Ω|K—&‡΄Y Πίzώp‡ŽU!‰kΣ±q›‡±*@#eΧρ©r4&GIΆg֍αΕΡ@ƒŸ‡ίΠ‚H”pβM›¦BW‡HgE9#,τΠΪθK0•Jάq F:F $fυ]Κ  šZ,φΌζΘ"Έλη‚h:ܞE¦ζ—¦,‚ΦEΓη­Œ•ύΆφFττιtΦXρk _^šš~ |κ<)ί5gVιA –¦SQњΖε5 ΨEΛ¦ ˜€sZ‚71Τ{Ύ}δΟdέτκ£’Žπ ƒžί¦ƒPΤΨ‡'—‡ΫΗ•sOή†$±BΉ1³ΨYI 0EWεw₯^I"NE$Άτςz<ε ΩΈŒ;Θο"`pώ&35Xdz˜αˆ^(Xή[qθ>- yN½"Δό“¦Ψ-Wξψt¨ ―V²9xκΨΏιyξ+, YζHΤΦσέ0=’dšφaXАΠΑ2œεuΌ?Ύs“ŠVΩ¨Ξωώεΰ`žχΧΦ9.“c}Έ}ΓXΫi’d”Ι6Vu‘ττœڟ§•¨ξ±κ·‘Ε“±ΙΐeQ'ΩΊίΩ₯PQΝ‚&ͺ@=!`&ν‘^‘ωšΉ_9Q'ςΊ§ύΪ5μ6kδ£Θ…¨γϊtε.a!fAH„΄Ή2ΌIm―ͺ'‚5/LP?zIΟ?lRαΦ lZ]0Τ@Ήš|h ^g-z’/W#tευhIf!θάΟlZFΟψm@ι!V6UΌ ―Π#±ΔχB]€‡1―”$•ψœxΤ€ ?2]φψqΡeŽeςf&=OΜ Ε–;X)™ρ$qLΥtΚ粫Œ·k•šΊ'{a$――,3fI,b "Θ¨‘Œ lΔiΥI±¦ύ„Πυ‹δ’ΙU†BŽT‘Arύ`π»[«01ξ%E@θΕq>†π.Π¬;Ξχ±γ4O€ΰ3p₯·ύΥ0ύIz½­ΕŽ€ΎmΰβΊ­Ι{ΐε0πdH¦δJAš\‘ΌŸΡ7ε€ώ[ gΝλ­΅Σ C]₯n€ƒC`€HΩλ>οξξμνί3­ώ~ΦΝrΟδ}―bKGDΫΫΫ—»$Ί pHYs  šœtIMEδ#¦υ? IDATxΪμ½wΌΥy6ϊ¬Ω½ο}zΡ9G½‰& H˜jΐΫ€ω&_Κηλόntβ/χχݐ/Ώ$ζ`'ΎNΟ—›ζc\0ΫΫQD“PC]ηθτΆ{/kέ?¦­™Y³ΟFBΨ³πφў=³ΛΜΌοϋΌΟΫg9ΛYΞr–³œε,g9ΛYΞr–³œε,g9ΛYΞr–³œε,g9ΛYΞr–³œε,g9ΛYΞr–³œε,g9ΛYΐEœSpρΧ£>κΠΙλΠ ‘<"‚όάΚυh(’ςΘH˜0MH~όγwN¬³p9­‘‘‘WΨ`€UΚ£Wπχj 8ΰ$€cSJ|φ³Ÿ­8WΒYŽΈψΒξp%€\«ό{Ωϋό΅jŽ8ΰE/‹ΕS?ό°sΑœε(€χ@θWΈΐνŠΰG?_{ΐΙ„ΐησ!‰ # ΒοχΓησΑνvƒI’F”RΤj5T*”J%”Λe”Λe‹E‹E4χβgR?𯄐oμή½»δ\yGόΜGyΔMΉΐo(ίu‘οαv»Ρέݍφφv΄΅΅!##ΓγρhB~Α’J)κυ:j΅ …2™ ’Ι$R©²Ω,’Ι$ŠΕβ»ύωiψΗΑΑΑCΞέΰ(€Ÿ%kŸπk>`ΰBŽΕbX±bzzzΠήގD"—ΛuIΏ?₯•J•JιtΣΣӘ››ΓΜΜ ζηηΑ»Π·|ΐ)₯ίώμg?ΫpDΔQ?­‚ί ΰχό&δxό‚ΛεraΥͺUXΎ|9z{{Η/Λί¦Ί™Lγγ㘞žΖΨΨΚες…ΌΝiC„Ψ½{·ZtΐOΰwψ Τχ/Φ―[·«W―Ζ’%Kΰυz?PΏ·Ρh X,"ŸΟcbb8ώό…Έ £ώœςνή½»ζˆŒ£>¨‚π‡~@h‘ύ°eΛ,]Ί>Ÿο§β4 ?˜˜˜ΐθθ(FFF@)]ΜαgόO·Ϋύψοώο3GtπX>ϊ¨‹1φλώ@G³}}>ΌςJlΨ°‰Dβ'φΝk΅j΅κυΊFβ©J©­ΰI’I’ΰrΉ΄‡Ϋν†Ϋν†Ηγω‰EήMPΙΓ±±1œ>}Ωlv1‡Ύΰχ_rΔΗQ—»ΥΏΐίΨΪlΏX,†νΫ·cνΪ΅ο β«D\Ή\F΅ZE₯RA­vqΡ²Ϋν†ΟηƒΟηΣBŠοF)4 δr9€R)LMMαΤ©S˜žž^θ0ΰ?μœvΔΘQ—#άπλl₯"‘Hΰϊλ―ΗκΥ«/ˆ½gŒ‘\.£T*‘T*‘R©ΌΆύ½½„ΐλυ" "ΐοχƒrAΏ)›Ν"Ncff'NœΐδδδB‡₯ό‘ίοηίώνίvάG\Β'€°ΔnŸp8Œ›nΊ kΦ¬Y΄ΰ3Ζ42­X,.Φo~ί–$IƒZβΡb•ͺR©fggqτθQΜΞΞ.tΨσ~mpppΨ)GΌ_‚πΘμΎ-lΎρΖ±eΛx<žE½oΉ\F.—C>ŸΏμ…Ύ™2‡ΓˆD"πϋύ‹:†RŠT*…L&ƒ©©)ΌύφΫΘησΝΙψέb±ψ―Nρ‘£.΅π_ΰqkμφYΏ~=nΊι&„ΓαEέόω|ιtϊ’ϋς—zy<-Cq1œA­VΓάάςω<Ν;‡#GŽ,”ŠόuΏ188˜qΔΛQu=όπΓƒŸπW„±Ίx<ŽΫn»  'ω5 d2d2™Kbνλ †Zjό!··λβ_I’‹ΕFαv/άͺ ŸΟkŠΰπαΓkΆϋ9|Γ1G\”υΘ#!ΰνφΉζškpν΅Χ.ΘμΧλu€Σid³ΩχŒΜ+WHeʘM—ΞV0“© “«`4UΕdΆ†L©Ž:–["ˆάθŠzПπ"ρ‘#ζC<κC{܏D,Ώχ½I9&„ "/¨(₯˜››C.—Γδδ$ήzλ-T*ΆI‚Ώ588ψώ˜9 ཆό}ΎΉ ‡eE"άuΧ]θλλ[΄Ÿϋ“>₯ 3©"F§ς83žΓ‘σ9œš+γbV΅ω±Ή?‚½τu…Ρ‘B’ΘO€b±‰Δ‚A‘PΐΜΜ J₯<ˆρρρf»=€ίt²πžΥΎ  [τϊΪ΅k±kΧΙ.΅šξέBύBΉ†³£:“ΒίI!S~λfb~n^—ΐ– ,_C(ΰyWο#IZZZ‹ΕDMͺΑΑƒ›qΟψΉΑΑA§‰£~"α(€―Bn€i±`·ήz+ΈβЦ!―rΉŒΩΩYT«Υ ώόR₯ŽΓ)Όrl?>™Eƒ^ž‘o‰άΌ:Šk7΄cΝ@…·#τz½hoooͺHcH&“šϋ΄~δr9»έΈcppπΌ#vŽx7Βί Ηχ-Ξo0Δ}χέ‡ήήή¦7λόό<2™ #§€σ“YΌzdOœG₯ώΑ ϊάξΉ’Ϋ7v` ;zΑ<’΅΅΅©[ Ί•Jo½υV3—`ΐmƒƒƒGΡsΐ…οAŽρ[ΎoWWξ½χ^D£Ρ¦Vffζ‚BzυΓ±³σψΞ+γ80^|χ'˜€ωΌžbΘο)x½ž’ίη.yάξŠΫνͺI’ΤpΉ₯:Ρ~C½N]”Rw½ήπΤλu_©RT«΅`‘\ Uͺ΅ cοώš]ΡΔ=ΧφbÊΈ]‹Ov»έθθθ@ °έ§Z­brr΅Z 'Nœΐ±cΗμvp»!pΐb…ό™θ΅U«VαŽ;ξ°­ΦcŒ!•J!•J-ϊσjuŠ7ŽMγ‰—&0’^°°G‚ώt,βO†Ct8H‡B¬$Iο l ”J…B)’Ο—ωB)žΙ•ZrΕJόB•Β@ά‹―οΑUλ;αu/^$ $ [«Ρh`rr•Jcccxγ7μ8–ŒβΌβˆ £ή•πoέΊ7ί|³m*/OR-f5 NΜΰ«/Œ]ΰϋ½ξb["<Υ’ˆLΕγ‘9·ΫuIΩξz½αN§sν©Ts6•ο.WλΑΕΫχβ‘K°umΗ’sό~?:;;mC†”RLOO£X,b~~/Ώό²ςΚ)HΰeG  ώ ΐηE―mίΎ7άpƒ­%*—Λ˜ššZtσΜΣ£i|yΟ0ŽN/NYψΌξRW[t΄£=>‰„.+f;—+ΖgfS}ΣsΩΎr΅XΜ1λ;ψ₯K±ͺqŽ\.ΊΊΊl BΖfffΟη‘Νf±oί>»nD·Ύιˆ’£xαU,ϊ~7ήx#ΆmΫf+όΉ\³³³‹Šλ§s<ω£sxφθΒ.!`ν‰πDwgΛΉ––θ !δ²~cŒ‘d*Ϋ19•\:›Κχ.ΖMΈ}C|x)Q"ΞA{{;"ϋnjΣΣΣΘησΘησΨ·oŸ]’Y;;βθ( έ ΰIΨώ;v`ΫΆmΆΗͺ]rτ₯Γk‡§ρΟG%Έ$©ήΫ?ΫΫΣv&π½+6Πν"€-μυ΅…=Ύ€Ον x]ŸGrI„B@c΄Φ ΄T₯υR΅QΛ—j΅ιl΅œ―4κ?ι9-—+ΑρρΉc3ιemš φJψΝ]ύΨΆ© "*γρ8Z[[TΕb{χξ΅Sη !Χνή½{άɟa044΄ ΐ!ˆσίpΓ ΨΎ}»Πς3Ζ0;;Ϋ,­cΞ|_ωώόπdf‘•j}έ‰ΣKz;Ny<ξEϋυ~δZΥŠτ$ό‘XΨŒ=‘€ΟνWΎ5£ςa` `„10¨›δΧΓͺυF½P—2ωjq.[)œ›-ζΕϊ»βj΅Ίgl|vΥθdre}Epσͺ(~α#+,ά-‰ ½½έφΪLOO£P( P(`οή½vΌΜΫ„wοޝsΔςgP Ψyza]sΝ5Ψ±c‡ν 655΅¨&—ΗΞ&ρΕ§N#Yj4ƒΆ΄―+qf ΏσΈΗγ^Ψίβ퍴t΅ρ°/ͺ~MΞ α=Ζ΄ „QΖ@P ``LQ…R­<“)gFf ™ss₯‚vπβwδόԚ±©τJʘ}ΓΏ ΏϋΡΨ°’uΑχ ƒθκκ²½F“““(•JΘησxα…μjžpοΰΰ ΣŽό-Χεπ%}τΡ €=Vš_Ϋ΄inΉεa"Κb…ΏAΎϋώκ»Γ(Υνe₯-šάΌ~ΰ•ΞΞ–Q—KjzvDΌΎ›Φ΅φήΌ©cε–e‰ŽΈ?πΉ}Dκ™61Ύβ2«²A@ m'``DΝP6`ϊ>ς&eFΐ|š;5ž=9UΘ^$˜Mυœ<;Ή΅RkΨ²7,ΰΧξYƒpΠσ‘@½^ΗψψΈ’}ι₯—μΘΪ‡wΔσgάy睟άΫhΫΪpύχΫ†šΤXsΣ;UΒΠW6ΝδλilZΏτεh“p! ΫWΔΫοΈ²kνΊΎx_Θο ͺ֝(]QD΅κΠώŸpV_ΩLŒ―1}mώ/Qu‘† Τχ!x]ΎήΦ`|yg(.1VŸΛU5Π# δzΊZ†k•ͺ/W¬cηSU9=-ΛγM j΅ͺΥ*B‘E H’„@ €\.‡P(„@ `ΧwπŽ]»v}kϞ=³Žˆώ+₯²οkζοαχϋρΐΨV€ΝΞΞ.Ԟ ΓYό―ǎa,[³%ωΦ―κ}c` λΈΛeŸ©wε@΄εž«zΦ―μφψΌ./$’‚{Y]λ«.€’Tιk¦dΘΟS_ FW€ι"ΟˆŒ@Μ Ž€xέ’»»%[ΪŒVkΚbHCI’h[[l2δχfSι|eΜro$K Όrd"H4!ΥV葐uό‚ΪΪΌP( £Z­Š"7^ήΉsηΏ=χάsNρO£xδ‘G"„h7ϋ‹wί}·m-*•B:έ<χζδH όψ δͺbΉŽ†|©+6-ߏ…ηνήcIΒΈοšή΅–Ζ|>—WxY‰n•™4…  &γά}u“jΡΝ9gΫA`δ=„Ο πhοΑ s^Λ½€=”θˆzύσΉj±R_Έφ9 δ:ΪccΩL‘­R³&•κ {Ξcγ’ΪβΝkλΌ^―ΦJ½££σσσ"4ΧAiί³gΟӎ˜ώ*€Ϋn»νομ4oίΎ}»mI―Ϊ–ͺΩzηlύ$ͺ ±άέΩ΄aΩ«^GΘπ»%B>²Ή£ΗΖΞuα 'Θ[tθV_•uΣ3θ h  LJ€ “κvτ· E·πojεsΤνAΏΫ·Ό3œp1VŸΙVθq»k]‰‘JΉΘ \‚exαθ<ΦwΠΡbŸy\.—αυz…™€Φ]Ή³³£££¨Χ-ζU»vν:°gϞލώ)₯ΘΌ½ΏΏ;wξζ™W*LMM5}ίγΓ²πΫΥι―θo?ΌrΕ’ΓvY|ύ-ώΐΧ.ΩΨΧκ”$’±ξŸ―I«ζτή1W‰UXy4 +¦(u?όzFxYΆA2Ÿ¨b”|#V €φ˜?πfεB΅Αš’Bko‹OΊΐΙL±ΣJΒ{%±±7ˆφ„=(‹ƒ–kJΡψ—Λ…x<Žση…­nέ΅kΧΏοΩ³§θˆλOPΖq? ΣDή@ €{ο½W˜ZΪh4011Ρ΄{Ο™± ώψρΒ>{!tύͺήΧz{ΫΟΩγš–Ξ[Άtmzέ~HͺΉg<Ρ§Ήϊδ—tJ˜O9BΒ4:P–zΒ#}]qp˜ž©šBˆ¬²nΤ Ό`έ•xέΎώφ`¬Pͺ•²₯…ΉX,<ς{rsΙ|3½°οXW „Ρσ7U‘HΔΚUǞ‹E„B!0ΖD/ Ϟ=O8βϊS vνΪυ7v˜·οάΉK—.3==έ¬ω$Ζfςψγ―Όƒ² Ζ/I€±iν’WΫΫb2ϋ―ξ^Ή~ ±T"d‘Φ„3O4?! DRμΏ&δœ"ΠγψgΧGU :φ·ΊΌΐ3;5‘ ž$υ΄γn‚ΖtΆ²`T(ΘFBΎΤ\2Ϋ˘qeΐΛο$qυŠ8’aqσUJ)ͺΥͺPΉϋ|>m”Zkk+¦§§E…CwνΪυ֞={N:"ϋVCCC7ψ’ωξ\³f »ξ:a²ΪnΚn₯²όΩcΗ„Ω}.‰4Ά¬λ©₯%6#:6βwΉ?qέ’έ­Α6έjΛ4»(,'λΒΓ~=ήΰΒz<ωgπCŒ(€ƒ°ƒw8ΠΟ,ώΎ¨ŸΕN@HkΤŽέξρdΉ°Pή@0θ/Δ#Ή™ΉΜ³¨Q†·O§pνΪV|β2αZ­I’„a]Υ€ΦΦV ‹ςΫ΅kΧή³gψ *€‘‘!7€§`Jυ …BΈγŽ;„;ͺΥjΣA•εjωυc83_ΒώΝλϊ^ni‰ cΙ―οΑλϊ6ΗBވlΥ Ρ‘ΏόΧ(όzθ\fοη#{λNΈχeΔ¨ΜΏΡ 0H·eW`gρ ΐΛ½Ii„ƒž@GΔλK–ςt”bΏίWŒ…ύΙ™ω¬E δ«ηFΣΨΎΎ n›&#εr‘PΘΓA„\,΅!§33@φμΩσΌ#Άοέ’.αg}ΐ&σΖνΫ·£₯₯Œ1ΛcffΖΆ¬—1ΰk{NγπdQ@`m\³δU;ΛίχωοίΎdsΘο¨p·ΏΌ5U=w.Χ˜ ƒ"€ͺLLœœ*Φκ·7μ@Μ0žΛΞ`zc‘Ή7£ ρ‹ϊ¦–¨?rΣϊφ%^χΒ£‚‰θμΖΥKφB,„Μ‘©ίsΖΆz³kF΅ΞN+W΄kρφϋCCC«±ύ€)…ψ{ΨΌ½――λΦ­CϋTͺ©ίΏοΰΎs()|mΝ²mmqaŠΩ’Έ/pΟΆήM~ŸΛgb5›FaΤ₯‘(₯²Ϊ_Σλ²τY¨ϋζBKšH41}Eσ[1SΎi_\oΔBžΠŽu­KΌ…•@[[|rΝ²’מ>œΔ‹μ3ͺ+•ŠmG[[›†ΆnNtχA=rΦεώ@‹™ήΎ};|>ŸΑκ«ΠΏY²Οθtύ}qw遞–==bΆΏ=βυέyuΟŸΗε΅ΚΌQ6tήSS„ž©1{fPΊA7±Ω#Mk1X3ϋέ΄ˆγ‚ <”’Aoπ†um½E4θιi^ΪΣ*lβρ7?Εθ”}Uo*•ΆeχϋύQΨΪΪj7ΞνΎ‘‘‘Ρύ€(eŠΟo™·―_ΏέέέB˜8??o ύΛΥώα©Σ ‚ΧΫβ‘ΙεΛ{„-§#>—ϋž«{Φϋ½.ίγ₯žθ6Š…<ΑλV·t/fšψ²εέΗΪγ! ’ŒαοŸ:…r₯nλ Ψ%t΅΄΄h.Ρϊυλνz>ώΕΧΏώuGz? ΰΰ7kϊ-[Άΐνv[όώB‘Π΄‘ηw^Ζ‰9k2[ΠοΙ―[Σ:5ΙΗ%rΟΥ=kΒχB=ς˜™gΰ6©`”1€(υϊDιη_WtΣ…[{n<Ž€iΞ1μ]#0»χ²ώˆΕ,Σ-Q_dKlΑ&„­[ΫzΠο±fœœ―ΰ©GlU{˜—ΫνΦj@Φ]+:ό†αααΫρ½ΜΐΠΠP?€_1oί΄i“-ρ—L&mίομX_{mF@ϊΊaMί~»Ξ=·_Ρ1ΠυΕ Ι•μrΟy#₯i­|—Ϋ[z^ψ ϋ1Ζ#συΚnŠ‹ χπ>Q•S(FτηŒ¦ΈΜ ΤψηgΟ _[ΡΧ~Τ;οΥΛcmK»"έ inΟ£YQ₯p_7q²,kΝy,‡2“πΛ]{U$L;ƈ.”²π£₯'Άžθ@νX…Ψg:²Π_³šΕ»0"§Z.Ί+O$J―θo?"zν?{•šψ­j΅š0ΗΓεri(ΐγρΨΕΫ‡‡‡w:"|™*€G}΄ΐ―š·―[·±XΜbω)₯MΗv½x`'Π? ΜυυuœΣρϊ\ΩΆΜ„Ε/άΊΉΤ €jςu‘§Μ¬δFϊCξν‘wξΠ•ƒφ:'δL`±Α˜Qx•Χ S1ˆώ`„*nU2™‚ “‹…™ž)ΐΤ`ψά…@*΅Ζ΅εκ[q: Xr.NΟWπβ[M AQŠw,ΣPΐΐΐ€έπ—AG„/Sΐϋ4LΝ=C‘V―^ I’, —ΛΩφρOeΛψ—¬7‘DHcΝΚή·DΕ=„²sKηJ—D\Ά~±Α zίkέ|δN}ŒκΑ ¦ι¦l(ο €™¬±ςœZjQŒξ€šΘGtdΐ ¨0Υρ€l˜ΎΏξ^€>„σl8ΟΕjγ‚2ξ!lΝͺ%oI„X.βΏΌ0ŽdV\„Ψh4„(ΐνvk·Ϋ5kֈί544΄ΕγΛL<ϊθ£^έΌ}υκΥΒUΨ­§_:/ΚΉtIλρ`( <πϊΥ‰ΞxΘVnsέ=gFHΜ8²AaΖ5αb–c((“S4Ρ--Χσ“d¦½%3ψλΔ`ρ™Yiƒ0SΉW¨Ί]S(jύΖhhBύΚs -(J((Θ¨?εgίEηα`П_Ά€Ν¬6žήg?8NƒRj1 ό½200`7θ·1ΎΜcμc 1>Ηƒ•+WΒγρ™;λ?>“Η·Zϋv}ž|_§°8€-μρο‹/a: ΧpΈ‰Ζfœ)ΧχϊμιH@ν½GΘ_ύ£ =5 ?ŒŠ@w2`dσ™’£8«―*’³LxrPS χFFΊ₯'άCW,Lύ73Gΐ2₯wΧzΌ――σ€(*πΤΫσ›ΙΫ’‘πz½ZCυώ¬‡”D3g]F.ΐoZˆΊ+„ΎBΦ»―ŒŠ‰Ώ₯‡ν†n^ΏΆ΅ί%I‡φ¬ Π„Ϋ°i&”©@_JΖ ζžiŠA·ΨTΩWΡ„ιΦίδΣέΰ}y9¨yœuΥHBU!` # ”;N #}ΣP—yT6j΅}WM%‰Π•K»‰^{ζεQΫγ2™Œπήΰ+Db>εˆςe’†††VΈΙΧ—.5dύ©«\.Ϋ2cΣy|XZDόΝΪ•χμ F:[B £έ'̌TφŸi>Ύ@ P.¨o†υ¦{Uωκ~―`˜ΐΣ™|B gLεJ4λ)*>8©„„ͺƒ!l¨Nΰ””κ0Ν'·P°b₯^ωIΪΪⓉ¨•άσNΪ6C°V« ›ΌƒA-b …„Ιc~υ‘Gq€ω2AŸ‚)΅³³Σ29†‡vλGoŠΩγeGνŽΩΊ<ΡΛϋφ°₯Ίΐσ₯‘ώ%@ŸqKSΤ’(SίF•BΖ¬€ ΥͺEgg`Q˜!Ό†ˆNVmύ»#™HυcUΒ’1’έρΙ—κ%@E/οn-·ΉFΟΏiΘεr  Ύvν—-Ί‰r•#Ξο³ψάη>GόΌΘϊϋύ~ΛΕm4vSc1Ÿ)γ©CVίΏ5œŽΗ#Βfžk»CΡxΨV'θ¨I2Ζ€fLήa% K ξΟ›Sητ0P. ΐτω=ςvU9hΦ<]A(ΰ_±ΠJ(OŽίSΝE`<υ  2Σ…>7@\9Hτχΰω9Œ¨ΈGͺΛ‘+—dRP>‡κ΄Η…­X,2ίYzΈ=s8‰Ή΄8Σ³X,’^―[ξ“`P&΅··Ϋ…ΑηχYH’΄ ΐr~›ΫνFoo―όkΦΧΥΓSΒΫI»mƒΘ ±nžΜRXΑΚΰ ΕΊS«ΰFqρώΊμΫσa0]Π4Ÿ€2Ζ[Sαr Σ‚ϋΜΌ/3ΈΊΒ!@CvτΨ‰πή_m=yςLxv.ι)—«š›―rκo$τ‘œΒ "+:™©aSΎ %0 ΈVŒ―ΆορΟη-ف>ŸO‹H’dΧ9κ“Ÿόη%G€/lΉίγχ{ΠΚ χ ϋΓ«ώΏhUͺ <ωΊ5ε7ς₯‰¨°ΑG«?˜ϋΒJzΎ,–Jφ‹ΪTWFΚD~IVD"ΔP¨―¨{ώDŽσΙ-ϋ!L;€JΐΗ IDAT£η:oˆιs±6uζ'”ΰ“†x(’|ͺφ DύQ0<υέ½­?>pΖPΫpΗυrŸω_8GυφT{ObLeΦΑ F(+”λεjΦ‘w ΰLΒBEŒάŠΗ#sΡ°?™Ν— • ί|c»ΆχΑη±fƒ D£Q‹ƒZΎ@oo/Nœ°θ–nJιuφ9bύ> €‡~ξ7oονν…Χλ΅Xz½ŽZMi:>œDΆl φυ΄ž²ϋό}±Εάˆ<¦ψɚyeœD¨­q9ΛM(ψD?ΕΪ3δΩsB 4BPσΛ)•ίGφΗy«Ξ'šP€Ϋ‡fη’³πΐκύE(„ζR=τHxΞ‚¨Δ‘ύ)X*WΝx γƒ^(7ΠΧέzΪΒψ—8q.eKV«UΛύΒΟˆΗγΒR>ζˆτϋ€‚Αΰzόooo7ΐ…¬?μ=d5ς^·«n3»/ΰ•\νq J|ŸY”x%@ΥpŸΫ)SόtΥοgΪ Ο ’‘ Π_Χ³„τΈ€ς~”1ͺψ:άΧ"Œr$•9ΤΗ8•ύyyίΧ^[8ΎkσΖ΅iθ|…Α]1¦sІς©ΛΣιRΞ(μόƒΠ u ΪΫγγ·ΛRό£·νέQ5¨Ηγ1τŒ΄s·#οp—Θϊ››@ͺŠΐΫO&_ΑήΣ֚€φΨy»ΈΖ%Ρ„$I“;fΘς΅(ϊ2Ζc”)‰hTd9§&«Μ±ϋΚλΪƒͺ³ρ„ͺD ₯L!ڈj9‚PΝ6¦λi Š0ρυzίώώ+–Δ—mλϋK]νE%jυ{ιߟʍ ιΑ”°zΦ'R•ΌIπM<αΆ/¬$I’ένQK]π‹§³Hη*Ά @ ΰο₯ΞΞNΡ‘«†††V;bύώ(€Ϋ,BΫΥ%„F£ όO o«Ξ„mqyok0‘Ζϊ΅ψ{%`IΣεΘ=fΘHeΪΏ)W·$ /QΆΙΡYc0ͺ*=tHxaΡcξς%†Ο4‘’±‰ŸΧŠ~d…BΨα#'b#³Y wσ‘[ΆΝI>Β%ϊcΘRρˆ1 x2WΙ4£bΨo€δtuΆ ‹ΆΏsN\ϊ]­VΡh4,χ Οώ' »2α]ŽX_b044δ`iΣΤΦΦ&lϊ!j₯ύοX#|α€7…₯‚Ρ€Ϋ {CŒΛφS‰6³Π)/.OΝΦc¦Μ<93Fή—j‰@J؏h‘?ͺ‡ε€Ζ ½ˆ`Ώ@5.0έu L+4Π3 uΎAu+ΐΨ³{^Ά4κˆ}tσζ σz¦ŸΚc£{bjΒωςχO–RbθoUΔπΌΉ‡ƒΩpΐkΉ~ϋΫχ~(—Λ"xBˆ]R£ή° ¦?ρx@@ΨλίΞϊJuμ;cΝkoŒΩ}πŠŽ`”σk5kP~ͺaaΥi œ ρ„ bΙε¨!5ψο ”₯,Œ½6ΐX.’Ή”Q=7@&σUΏš2F,!Dy?rŒŒ^8xΖ2Œοηnί6π{λ*j`|Ι°ρ»¨τΔ ωsλ Z™+eΝBO¬(€iHε”@GkΤΒίΌt6‡|I|/¨."o8ΤIBΪ{vtˆ½ρ‘Gq—XάhήΠΩΩ)΄ώŒ1[02™χϊkMΪ}pg"αc΅|ʘζ0Ύ&_―ΠW_β;cΊ½Υo|έ7§Yp9¨ e*5KΘ`…)a–\E`ugL‡ά `ΟύψΛOΑυΧ~ho eœ!ΌBΑe6ŒΝ€ΚIj„Κo%"`vTm­1K c #Y[7@tοπ( ₯₯Eth !dƒ#Ϊ—Vl7ohmmΥ’7̍?μ*N ΪGω<ξ’]· ς†)ηΨσ!>•3…Υ”„’eΫYϊ{(œbΠΓ~<Θ’_₯ (S(Eθ9ΑΧIE¦ϋKJtΘΟ ‚6ŸLyžxωάΎ}]¦³³½ΣώΊ~βα:‘†‚!¦83Σω9!μ'fβOs!D‘B[%Ž3>―ΫBοŸΚ=xAΤƒvš―ΞYOMπ©ΚήΛnΏPή[±”„ΪψΠΊEgΌ€1Γ>LΞ †Πœόθ ϋ^koPjΙΐΉνΦλ&εοI˜1jΐ(t’2ƒbP ‘„–-Τ²³ΉjQHώ1#ρG €&‘T`h\ΛΧNΫwέ+ζžνννv.©³.…ξ`Έ ~Ώ_σEΡΚk81kΝ ˆΗB³vŸέχ5ΒήΧ›“kΘ‘ ;5xœ ΚΝNM)ΏŒ'βΈθ€œαή[%)W<€' žSΠstΤO)+KWΏσ²εNΏjuoqυκεi5ΔHτvΒ" 5š’£°sΣ…i•°!8Γ,‘ \ϋa,Ά\ΛSsed U[`ΎΜ  ΅UΨΌψJG΄/ °UΔώ«ΓσD€’55' ŒEΓσv yύJΞ,γ;z0cσ½ŒB΄Ÿb!uxΰxNψuΛΜΤP!Υ}~9Œ+Ν'QƒΒ!:a0ͺtΦ•IC’&ΎΊ`{¦X±\«ήqγ„\RΜs„=άGΉR`-3‘pω εJ½tf¦˜ΦΡa6>ΎIΈ­ΦίJb2“Ν]Θ΅!BˆXΆ!ΆασŸΌΗοK£,„K<·θ liwx\j0δΟΫ†—.?—8ΟΈt?%LΗeΤΙ ψΤ ‡uͺ@1ΉL΅Π„ƒχόkD ω+μžϊ:Q³ΔΟ <aeZlŸ)IG„R•{Π" ΅ZO<½Χ’υ²΄#V½bΛ†ήχ§†F$šΏOyT’)EΰΟMεΗ™όc건 ρg±ώJY).v0ΰ/xά.KφΟδΌΈ(LΔ˜Q€MJ°—RκΜΌD `½E0Γa!όWI@ѝ±ή‘°/έμƒ^·Χ υPšoσ~>εκω¨M4_™PƈΑ‚ΕgΘΞΗV4Šζ&hdΡ³Ή€`ΥϊRͺ"ω?½Μ}ύδcίyη΅“‘p¨ΚO!ΡZρΏŽΊ’huΒωr-|<7§DS)”y¨L1 2ΐ@$₯μY=?T1T)Φ?ΣΨθTέOύ’ }–kzzΎ‚zƒΑν"B`N&3?‡Γ˜™™YπΎtΦ{Œ†††BΪ Ξ—Χ Η#le§2ω*κԊ ‚AŸ­ςΉ\Z)―žπΚ8GVΫ«ρ|œ8u&τθϋ/Ky'Ϊ¨7λLu²PCrκΑίgκCνDγBˆΠπTΟρ'ϊC+Pd'EC”' Ώυ̏—X‘ΔnΊiϋ¨ΦHεdU¨F¨šnΜΈp#αHΙ£ηΣΓΜ¦ΜΖϊ[ΐb|+/Đ)Tl9#3’47΅αρΎψ OU«o†ϋvπΏX‡|>―mΛ ―[rQ΅Χ‡Ι²«HjGm’ΥΌώζα؏ή<όΡ›§‚kϋΪ:?~οΝ³Ίrsλ‘Τ4Y½UαK5λ½=”mͺΠΖθω‡DG†#¦Q`Œk~κτp|ί‘αˆωw?ΈλCΣ-‰xQ‹cθό8Lγψ'ΪΖ€Ωtifd”1ͺ Ιdι•£e Q$n;³"#:πϋ}BΌ_,ΦΠυΫ*s$€_6Ι@}Žx_|`©Ζ໘/œ-(ˆΒ=`~ŸΧvL°ΫE\Z›/ώ~`J{kuθ…|kjqΑrΉ"}ηΗ4Α:>:ηω_σ_=+{žkθώ[g>tΥζy―Χ#ΟΩ#zOn‰#dΤO4ˆΝ΄Š;¦M#\rnςˆIθΒ‘/”\§NŸMœ‹NNΟNž‰B`;oΎv˜#1UFφn֊ΘͺZLω6΅­½~&5¬ϋλκHAYΨ•ΜAN Eΐ™\&xΊΆΣ}>OY± ΔxT…+ΊgΜ €oμήtΦ{―:­VΫg«μ@©,ΘψrΉͺD"ΆΉε’DT#Hd΄‘ŽΚ’»ό(½οe³¦Υϋ€AvμΉ]TDvr,s6_W•S$]B)υ9§Τ―« 7/δ’±θ‘ηMu»\•Z½α7ήβόs#!G’>ϊh`χξέ%GΜ/ž°€aΩΐ±¦«Z΅2½’x±‰Ό ŒBνΥ§φΈ7ސ…—Χ=μiA9-ΏN§<ϊ·O.Y?°·γ‘ϋoΈκΚΝs’DΡ§p0ΒυΩ3˜]Ζ’)₯ΔFfL•¦Z½ŽΧίx»λkίϊQί±σsΕž§Ϋw^V)0 Σ­½nφ©:3 \Z$Γ|Ά2d,7 ½©eΨO,dŸ €ψ^"Ψ―½fQ„C<^«jV•j½)ΐ[}3ΰλχη˜#ζOXβ/*(Ϊvš<'Πώ^·ToφΑzπ™h° t$ ‘β†ι9ΐωk?·ο₯7ڟψΑώ–r΅nkqΜzη_zŊΊ~ώΑΫΖ6n\›”a όη›xB£Ο`ܘQ ₯ ―½q°σ+O>·τψθόiΚ·,K­\±4ΙΜώΎβPCΣ3N$Ή­ΥiεΥ“s§8_ί,ψΔδίΫYwμ·°ύBΐGh²kΗψ‹ϋφw~υι}ν9K ƒg&ύωχ•7l^–Δ9ΏzεŒώYZ% ‡σγ†vvβδΩΔΏ>φUožœ½›ύΡ;n:­°ώ)G ώ00C»(c”g“οδˍjΑηέ†μγ…έμsaNΦΤ nI²H{ΉΦxΧ.€ΫνΆ3:QGΔ/Ϊ)vmδλ !ΡΣt6]­AL/τΡ}ͺĝήοšΘΒ©3b ’Ρpυ;wŽ~ψ¦k'φΎΈΏϋ«ίy±C”o―}‡Ξ…χϊ‡υwέ°1υ±ξινιΚσρ~Ώ¬xαOg²ή―=ρέΥO< γݞδ«VχfΧ―_=­Ι7Ξ—Κ …J<ŠH@ŒLη‡ΟΞ3<τηcώΌ€@b°D(ψβΜΖ7 >5 =ŒύΦ{€ύD7’ΛεΥ™ΏΈ ΐo%η$ƒŸΆE Ϊ…,0œR£ ΉV›³Η4 `š'Λ!m6ΣΖb³P(DοΈύ–‘7nρήW»Ώό­ΊJΥΊ­"xfί‘Δ³/?τ‘kfοΊγζs-‰xYύ©Z@™ρχς+oτόν<³r.Wjzž=.»χΓ›''f’Α—XάͺϋοΊι$Qš{’Χ1Λd£>·Œ?{jωγ\Ά2σκ©δyφ›‰?Qi°φ¦Α’BfίΞΓ<™›Ohρυ›ά'‹Ή‡l€ίρ‹«\ΛέτΉh‰va LŸ(Tκ5P0F˜šΉΗ(Q‡’L“ˆ!b`Πε&Ί„°P(X»ϋŽ[GvάpΝΔsΟΏΈδ«ί}₯³R³ς”2ς•gχw<ωά›mΏςΐŽρΫn½q8ΤΤ;5™ΞψώυΛί\ύύΗ[šύ†€ΧMαξλFvήrύ—ΛE?υ»άjήg]{~λΖΑ#{’r Z œυΥV±άΘ½ptφ3 :U(IαO(kξϋ‹bό’P ­Πσ―1y–šά'‹Q’Φsxοί8 ΐJΖΓ–œY<|“D]jFfˍS[0Εί6ŒχS"b|Š­ΐgκ˜ FΤp‘>8' W>vgnΊιΪ±gΏγώ'~πF‡u*Χκί?ώΓΎ§~πZΧρρ]g·oΏjμΘΡγνωOŸΝΪ[}—$±‡ξΈfτž;o9GΛΨ7ΏύύuΕJΝ’PΈ{ΗI"I nΌΉa !QΙn~9P5Κ?:2}¨’OωQ££’Œˆξ/πΧΒζs[$ P―ŠεΪΊ₯…€9»t†Ζι x‘@c1k!4ΰσX―S£A›±‰¬ή ¬\§5ΏGrA0₯€OŒ—ƒŒ(|f$«΄’¦ΧΦΪ/ώCχΏyΗφΡoηωeί{υ˜­5Oζ=φί\3π.™Ιψš°o]1KŸΌϋπ’%έYυ„ε EΟγOΏl{»Ό+^Όζκ+†‰\¨rκh2¦Νϊf όΠƒzƒΦ^::s0S¬W`λEΐΕσ-p_ύ«JυBlώ…=œRjΉοΌiA J^%4Ÿΐ…ΈaΏ uXzμ¬Ώϊr₯^φΉ½A-ϋ–³RΪΌ¨Σ2™f' ΄lƒUcDσεU%±€·;χ™OβΫΩu.ώ΅oό`Ε«GGl™εfΒίUϋ/ί}dϋΆ­£ά‰bΑ_ΨΏ,]¬XΕwέxΒνv5ΤφΖ„˜Ÿ( Π‹š V}εψάΫSΩjAf΅Š#ώHΣPYφ[ A‘Χ•¬αυͺΰΪ†ύnχ,**`ΣiͺζˆψΕU₯E^ˆζΐkύΥFΓΫ `Ωb­ yΩg„¦L™cΙtςLΓ«Lθ«fς¨―εςί‹­\±,ωG»cώΰΑ#=ΉgερΡΕ'πά³cΣδ/~ς£oΗb‘²j¦Υω}₯RΙύψΣ/ρ"ΗO΄μγΘΝs™’'φΧρp©­%QhmεΫZ[r-­-ωΆΆ–ΌΗν¦A½Ak―Ÿ=x~ΎTPa?QΔΈ’oΏ±ΗŸ“ΠΈmF«HIΤκΦkπΉΝ\€p²/²(Ϊ]sγ†f ΠώυzΓ§€ω2‘π@ΊP--i ΕugT`51GŸμ­ηοͺc±”ΉΏZ"UQ {•I[r,ŸΒάΊirσ¦υS/ΎτZί—Ÿ|~ΕL¦θY€α§Λϊ{>Ÿ―ͺd(\•βή_[6›-yE‘‘ομ=΄`E›$ΦΫ+¬ξoΟλαtένŠ$Z¦cρΆιhKk†;k’YZ€δkͺΔ(ΐΘ{d€ZZΨy°hi:οˆψΕUY«ΰΦmή†©E,δh}J₯ζχϋω‚ Ξ½ΨT¦Rά gΓ1­.^X-N…’Đ΅GΤΙ½DcΠ΅βFτ’"™`P sΉ\ψπŽkΟ]}Υ–ΡονyaεcOΏ·OΓΝ Ο₯€S~ΊκhiΊrΠ<(₯ώ€DΤΦ_J‘’Βα`εΑϋο8rΣ ΧœύΖS{Φ}gο‘»uz2όŸ_όκΆλ7½²βηξŽΛ—χΟΏΈου•ΙόE‹USJύΉ\Ύ?—ΛχOOsΣx ˜ΟηOF£‘ιp$:ŽΖf’‰–ΩhKΫl0)›RpuΒ LαP)U„Εϋ‘€·© Π,`§csŽˆ_\`iσ¬ŽύV/±l@Ψ‰K2H±TΗbΆ]ε–Ωj!Πζφκ7±€λ=φ"MιV¦Tπ2m¬—$*‚Ο0J˜–ςK4·hooΝζϋΔώ[?Ό½ε+_ξζ׏%μNΨK‡‡Ϋ^>ς»ΈuλΩΧžzJVH₯\n-—[ggf ½σ<O>‹M‡£Ρ™H,>‰·ΜE­s‘H΄AL–Ÿη X±T ‹ψŽXΨΫ”7βο#³°™4])•JGΔ/˜ΆS*L3Wq‰|:‹`Y«gζŒmΑJΕJΔΖΧή`*]Κχ΄βψf 2 ˆ6λOƒςŒIŒ#ϊΈb!ΖΉF+Ηψ Bn¨¦βaΒ#lεŠ₯sόΩO?Ώυƒ}_ώ―lžΙμ,ΪΟ½΅|‘“;ΠΛo]Ώt²£-QΘζKžt:›žœOF+ΥϊEi{]«ΥΒsssαΉΉ91ιv»K±Xl.ΞEcρωp<1·$Γ±xAνΔτœ.f§ Š₯ŠeΊQ[ ΏΘh˜ουž3­ρ‡~˜9"~clΒ σ …‚¦D€ŸMΚ&6τ„, _δof6+ l:S)Vλ΄ζu»\Z[MΨυΆ―qΟ]·ΊvΫ•'ŸψΦχ―|zο‘₯‹1GΏrߎ»χ#oH‘ZY³’ΐd²4ςΓΓ3§ͺ Κβmν$ή֞p zE‘”ΊR³ΣΩΤ\O>“ιΞη²=₯b‘;—ΟwΥkυψ{}5 o*•κJ₯R]ΐ°~oΈ€z,KGc±T4‘H‡c‰t$–Θd KBUGΠξώζ˜Iΐ|^HφŸuΔϋ"+€έ»wW†††&φYόrΉ ΏίJ©₯<Ψ\Έ»έzTk Ή\ ψύΎ’€Ξ—²έ­ΧΚZ±άŒ1BTΐO΅LT’MΘ#r—N%%˜1πƒΦ`Di;¦ Έ\λ«#ΉU:1½ω&a­­‰όυΫ·žzσΘΩΞ‰d~Α܁j₯βrΉHPzs†r΅‘;t6uμθx.­P+*Ιfιι'IZ;»§Z;»gβ•C±eηgz2©dO!—ιΞηr]Ή\«\ͺ΄q~ί²Aέ©Tͺ-•J΅aXW Φψγ=¦k²U‹YΩlV„N;β}ρ98Ν+’© ΐά¬ΑyCW«ψ&Θdςm~ΏoMͺ“ωj9Wj”Β~—Κt Ιε+­΄ΙV‰?&ι1yΘΟΥμZΒ1ΞT” ΧTuˆ<μCo &η)€³Ύ―ύΧ3W?½οπ²ΕžΜΗΎχΪ¦mΧ\q|ŊΖP-œ}αΨμ°Z.«Ώ’ι,lξaΪ †ΒΕ`(|Ά«ω0wŒT―Χ<™ωَljΎ;ŸΝtε2™|.ΫYΘΫ)£οiAΛc zt΅…lΡ’˜‘%c ιtΪύcμGΌ/8 `‡’΅΄΄ ^―[ϊ΅Ω5oˆG|θ‹ϋ0š62ΊιL±­³³uTDΚ2.KιΔ|1½Ί'‘Θ1(ˆˆ–τcθZ£ΞS•Ρgφ)9CD}ψώςqͺ‘# *GH(7tν}ρΥΥώΔσ[ηs%ίς*δ±zφϊOϊWώκεγ³§ηςΥͺ‚h»/Η)ˆIπΉͺ>»„Ή7'ιΈέžzkgΟTkgŠ$£Τ•IΝ΅eSΙΞ|6έ™Λ€;ςΩl{.—kk4¨χέά,’IτΖΌHD|B_„ΝπΏP(”ΧFόˆ#ή—F³ƒdυz]HδΈέnaμφΊUQ|νucd1™)tΦΈ’ΦθCΉΡG抹₯‘KrAfLΞ~ՁΚ0F¨2Cφrw~IC~2!¨( Bdd F”> ŒILσΡ!`#ηΗγ_ώκSΧΎ~|¬½ΩI[Ωέ’ωΤ'oρ«OξΉφΨωYCŸΒWο-ύΫ3ž•Ά–AT9U2”A§^ΤΐT΄C΄2bΣg›κΘe2-…\Ά-Ξ΄Φj΅&n± €λVΕν‹Uα§”ζ=ΟžRˆW IDATGΌ/°hΪT*e€k’&Ž"°¦?˜@©R  ΕH0Θ2Οk0F'ηK©ΎŽP«ζΓ+q{ͺBwN€™R$*— K’š†ΐα—‰=IATžψ£ΟTΈ*ΏNΛ•ŠϋΩgΈω±g^Yί ΤΦyυΊ\_ΌηΊ·ξΎσΦ7Ό>oΝοχ•wΕΏ>ha°Nžx`εΖ­o*U5„Ӂ2Ε)γ(‰K`2(]Π‰!q¦$nΜyΌΞΥz*―…c±\8+0`Xι , Ήl€M΅δ2ιΦl*ٞΟfZR©t’V«ω%―_ξ2Ξ­΅b "E3λovΤ{~PJί€Žx_pΐβ“'“ ”B’$ΤλuKΧV―Χ+ έ τˆ νζη³έ‘P@ιΕgΑΪzf¦ξj D=ΚΠ₯g8#rMNδΡH>¦±χ„0F©œΤ£δ#©Υw”*ͺ@έΈ¬xΧΰΠΫG—όΫγί½fd&nv’ΆoθΤCχώ¨――;ΕZ©5 ‘Φžη‰x*•Ύ†ί7—Λ]55z»«oωΈ^kμκΓUυι €†Ž3σ˜± Έ²Υ’ SGˆ¦8B‘h>‰;z&ΐ)†Σ§F:76ϋ!σ9YjsΝyHU’ΘΜ̌YψΑ{ΝνK€熆†Fΐbj4ΘησˆF£¨Υjΐγρ@’$ œ‹…½ΈΊ?ŒΧΟΓ:3σΉήώώΞγΚν`ώ©ί―•:₯/=Ϋ›πΊώp,δ Ί]r};  Ύι΅taΞ+ω¦Γ<±Η$9j@K&S'žόξΥ{φΏΣ΄h§=,ύςƒ;_Ϊqγ5ο4(+ΟfΚ3η¦ςγΗΖs)F]Άzέc©ύ―\cΖΛgή9zGWί²RδU‰B(σM%bH_†J‹X ½AJυΙΘ/аˆ΄-ί]D‹†πΓ­±tΎΪg†Wυ… ‹ύYlW«U$“I³πƒ1φ’#Ϊ—ΐ~˜f±₯R)D£QT«Uαμ6―Χ+ΜΰΊn]‹Ed ε–b± }9Σ­ΒΜсcM– £ΙbN’$Φχϋ;βώP,θ ϊ½.!@†ξ\¦1ΔςΑ΄ΜBe˜Ÿ)eŒQF±oί+kσ?Ύ"[ͺΨ&έά΅cΛ±»ξάυ—Ϋ?ώΦιδΜ±‰|’Re0clΩڍGή9tΰT©T6L΄›½΅Ρhό“KƒH” […τ#MI>5—…žπ_‡ *ι©τ °“~πِΜέOπ”‹εhΆP± ‘Ή~½xDƒyΆ€P‘&/ό”R`Ÿ#Ϊ—VΌΰ㆛wn¨ΧλZ>οΛω|>‘X»¬ΐyΛφι™δΐ²₯έG¬ΦˆXšα«m²(el,Y*Œ%K9Πxΐγn‹ϊόρ ' z~―Ϋ#IZ8©=Q†sΛΦ_ϋ­_λ΅W΅™π{=žΜ¦­[>ψHkgΟ΄>O“€ΘYΈΜ8GƒϋvLGέ½½λΕ( <|ΰ:³η|zΣO%b_œhεΝzΔX€iΈ_‘θb.›Hn1oσΉ%l\!φ ψα²Ό΅7ϋ"αORJR+e}ίΌabbB»€εrY+V>ŸO˜νς»q•m–ν©l©3›-Δ/φIi4Ρ7^ΉιωgΎ5h—7ί›½½½?ΪyοƒcΝ–½JŠ !Μ0ΝGm‘Gx™f«6_ω‘€‚ŝšΫ₯υ-ar6„ Ν9Q“‘gMτ¦‰Wa‹S°ΝW6ShMηJ–©ίχmmCPΠL’$x½^Γ=bg@Ξ=k”§ώόΟάiϊ>)€οšo―ΉΉ9θ+•J I’Ε5Πβ-]Βν£cMς'^™δlΛσίώ―ί9~τΘέ”Ϊ§»†BΑρk?|Λ_l»υΞ/ϋC‘’.aD`Αˆ:ΑΓ€9 I$ψύΑj<{Α||.—Ώ6—N…‘$*Θe°ŽTbΔψωΔψmθΥΪhρ‹‹/±›»κB­ίοή#fnn™LF„Ύαˆτϋ€Η`J bŒAmEU­V…eΐ‘PHςιn α–ΥVΤ=ΜχηςΕΨβnP² Η ΫcyBΡ|½^σ7α;*«Φ­{rΧ}ŸόӞ₯+Ξ‚θ­D-V’10P9*g‘>fΪ$2θνΨ#ψMž“‡άjΒωκ$w`9;r΄nα9KΞ‘ƒΨ3‹!v”}tλŸ+΄Μ¦ς«Μ{xu =‚κ?• 1‹?22"„ψώ"°hΰσηυžΈ\.βτρΫΆ [μ‘α‘ιΝ&BM(Μ’[–ΰ1o²εώΐŸ―Ίqλ‡Ύ-ϊΰΆφφΓ7ίυΡ?έ|Ν {\7Υ3*ίƒˆsfbξH²rγΦ.—Λmzrς=!Hέ„(_ά™Πϊ›Xμ?±ψœPίWɜ"‹΅ψZ‘΅²†GfΆ‰.ΐνWχΨϊώjυ0‡Šk΅N:%‚_ϋάη>WqDϊύUOˆˆ@5νWmbΎΘ’D!XΉ$Žλ–Y&c6UθO§²&²Jk iχ;[H‘hφ―Zw¬³«σws¦·nΫώΟ7έuί?Ζ[Ϊ“ &ΓΞt&φrB§t̊ΐεr³Άφ6‹%+•JλΗΞ\ΞyϋDΞΠ]…YΠgÊ:t{+φ΄?α•*Yΐ‡`I&³=sι‚Εϊ_·,‚•ύb ' Zξ ΐΪοott•JΕ‚ό‡#Ξο³<ΰMσφρq9rG)Φx½^ۈΐύ7φ ·Ÿ>7ύ!fθΡΙ‘]‘―ʚ >1‰Λ–ν7~Ϋνv—–-ۻ뾟ϋ‹εk72[M’OαΆ:ίf¨nuΗ•AΉ†²^ €΄tΥZ!”>yόne½2F₯ΓLn1Δ’΄*¦‘nΔώ·4Ρ¨rφτΉ©›DίΎΔΧλυj±ή,—Λ–tρcǎY„ŸRz¬X,ξwΔωύGπŸζ gϞΥXά|>oΡτ„Δbβ(Ϋ²ήnYc}-W¬΄ŽOΜ­2ί‰Δΰ‡k’0]ΨΔ7Ρ… αX"³λΎβC;v~ΛοT¬œ!6n1±²qΰ]™EbP ’ˆ΄dωκ‘`0xT€¦n+ςAΘ³M„.+pœαU%Ρ0Q^g€ΉΟ΅’šˆv›Ω˜/U-Aώ›WΗ°|‰ψ› zO˜sDfff077g)ώπwύΧν4½cμ+ ΄m‘PΠrj΅š πω|Ά\ΐΗnZ*}φόμU•J5 Όa™N¬©BΚ»°Δlξ‚ »ΟŒBeΘEδzY„ή,œŒ+ηUώJœ *J€I€ήΎΎgΜ_’R:ρφ;˜$Χ.Βξ‘:FΦίE¬Ώg1ηΓ|jΥχWaΚεjθάΨόΛMFψπ€­οoύBP©T,€ρ‘#GD•YJ©/π‡ψ‡³ž2o?sFοΟ καρΈΨ?μj β‘νΦΜ±zƒzOžί.ΐ¬axΓ&|qJAαΫAύ(@EDώLw ­ήrΥ‹.—d9QγηΟίΛ(“”Η’ɐ‹?ˆHG„"<|³Eb  τΣsβΤΨ-υ΅dς<΄­ΓΆε[$nWω"u₯R) ‹*ών _ψBΞεΛΗ€0o˜œœΤΊ·V«UabΧλ΅%oΫΆέakςΘlΊ0011·Š1λΟY<­ήJ6³|M¬<±z`°ψŒήΙm“όώP­³«λ{ζ/QTϊO9°MnΒA,.΄ͺAγop C¬Ÿ~ž˜Π΅βΘVSs||fύ|¦h)ϊιŽxpΫ΅}ΆΔοϋ«j΅j ύ9rΔ"ό”:€ΏrΔψ2Sη‡΄ γQ€ΪΙΕ|ρ‰„0<πΰΧoχΦ<5<³½X,G eΉhU)†ρΑ6£?;hτσ’`hμΑ$#Ii; ­ΪxΕ3Œ`?wκΔfEΒύΥΘEWA¬nγΩAƒ‚ BC„Δ`‘PŠŸ™έ)Ί6ΏqϋR„ό‘@F…|P.—³X“'OŠ*ΒΎ0μˆρe¦~οχ~ψ’εΖ=wN#vj΅šζr'X;W`σͺ6άΎή:u«A©ηθρσ·Πu-`ΕAš+ޚ ‘½p³zλƒE!HζmŒ©­»wΎ΅­Υ’ΫžΟ6 Ÿ<ΆQΩΧκZΏ«$Ԟ’¦ά…« …u=>zOƒ2KΦδGΦ'°ie›πZF£QaάΏT*Y¬DΒOc8"|yΊ „όL£Γ(₯ Άs6ίΡhΤEH]ŸΨ΅\θ δŠΥΆγ§F―'bJ(τL”ŒΓ¬½@0˜ ώ3±j^ΩO2Zjν½,(@ν³·rύ¦oŠΞΓ飇?‘’Ζ»‚Ο‡M‘)* ΉΝ\fBHΗOžί•/U-3»Βn|bηr;„(tυc~hffgΜ%ώ|ύ‹_ό’ΣωχrU»wο.ψkˍ{ϊ΄†κυ:ι΄%ώKA{{»0E8τβ3χ¬~ζΤ\nΝωΡιυ6–Π"τM Ώ–­Ηl”€n]™ IsθΟ$bώ ”φ€ςs¦ &?–,[5Ešk&›έrώΜρ΅²¬ξk¦œD(p©”†ί.r ϟΪ:=Ÿί"ΊΏuχ αΘoBZZZ„Π?ŸΟš~0Ζπκ«―Š„ΏΑ{ΨίΛX(λo`!N)ΕΙ“'υ9“Ρ Ÿ9,hη ¬]šΐ§Φ=32{ύμlΊoρ^Σ› !΄X]&1«₯70ώ(B䈣“"­ή°ωλ’ίzβΠΫ?oEΌ’!β胑θ3ε[΄ΐϋ33ΙεgΟΟν}―_ΎΎΛΆΫO$†ύκυΊΕχΖδδ€(οίΏτ₯/pΔχ2WƒƒƒK{φμYνb3Ζ07'ξΰ”H$„υαpΗυΨ±""„ϋΗNοJ§σvBOΜ€±„Α ΐ@ιί„HR…P!ϊμ|u]!…”˜Bδη„I«ΦŒΕ’‡ΝΏ5›Νn8wόπγϋ^Ωπ€£dF%DœίΠ,Š$•ΚuΏszς~&Έn\ΑΧ‹cώ^―±XΜ‚ψTw/ω­V«xωε—EΒ_π8’ϋΑ@`Œύ€Y³―wδΘίή›GΗqίw‚Ÿ_]]} €‚IQ’‹’lE–EE–m­νŒ|g;™y;;ž·»ΩMΏού}Σ|«T*( Žjaoo―cT@ΰ >ύώ1 †%§ OΌqεύω|© Kxς™ΎO[¬τΔ΄yυ·:ΙHΐΎς;h‹‰AΔΜ x3YΰΖφξNίοΉS―ΜnΊ¨Y,7e vΙΜIs"Ή|1ώϊ™Ι;9ύΓ>σώ1|σοΕqΊ»»ΗΕ—J₯¦’Ÿίόζ7( N-ΏΎόΨcMw »IΰsŸϋ\ΐμηgggΝRaXXXp,E==ΞCv‚> ό‘έyš›Š¨šξyντ•Šε¨ΫΝΌ„Ίοn'7%φXWYBH# 9WΥΏΑIΘlΕs„Esΐˆ ξΌα\4m(·ŽD"―ίtϋΑΏuψlό¦ 9gaΝβ_(”»Nœžό„ͺιM)›A‰Η?² AΏ³σ6‹9Ζό5Mkšν—J₯pόψq'Ϋ ₯τ+؝πΧβ:tθ7> Α0Μd2Η-Žθ¬ΧλŽ™a’$AΧυ¦Κ0F{Άωρ‹“ M©ΎΊNΕωT~4τNzd©d«tkj)ήlM88ά_ސŽhζ΄ͺ l2 (YlEL΄βσω¦\Όπž@ pι¦Ϋn恻ξύI Ν;™6πs6ΝΐnpΟ{4‚δrΕΎγ§.kUΣN޽?θ†Ά†]νώH$βXν7??ίφΣ4 γγγnύώ>ύ7σ7':°έdpτθQνΠ‘C—|ΜzΎ^―ƒγ8s…WUΗ9Vz½^T«UG-‘+,cG·„ηΞdšžΣu*&ς;ƒ~yΦηυ,•2Ίμ‚‡šΪ¦|| Έi!‹Ηo6ϋw*β‘H>œ>pΧ=?ŒtΕSŽ~„FR±Ÿk>ޜ4δτ€,,δOœ™ϊ”¦ιŽν›ώτƒ;\γύ²,»FtςωΌ™Κδ΅Χ^ΓΩ³g*ώ~ϊo|γΟ;έ„χίYBΘ]vXΟ/,,`λΦ­&θ«Υ*Ό^oΣdB|>J₯RS‰(°ΨAh{TΒ ηH€R!™Κοςˆ|6τ-¬τΔύ”uΦF“Γ‘³½˜Βέαh>G+9$λNBμ«9gYΕ9 Ι›F% Ž$ΰDΣ3σϋN'f?ͺλΤΡϋΌοΨλήα·――Ο1α§^―79S©ž|ςI'π<ό«_ύ*ہμ&%€cǎαΠ‘CΏπo`kGžΝf±}ϋvs•¨T*ƒMΞ?ΦC©‡v鏰-$ΰ₯σY§₯KeŠ£Ίͺ" L/ΡΫήxΩ‰YβF@sHٟ@ΝH„ρj³ΩO`?{ΞΑ‡Α5ΎZ†Zε'3χ\˜L=δvŸόoοΒέ79‡cyžG__Ÿ£έ―λ:^½Ϊ@䊒ΰρΗGΉ\vͺψ«θΊNo½υΦ³―ΎϊjΎΫMH†)>tθΰέΦσ¬0ˆ™ΜήMͺ#k!ζFƒ}AŒtyπΌƒ&€δ •|ΆΕ‚—xžW[―ϊΞ΅EΔ±ΐ°αJΥœ:8έΜΐƒ΅Z3T@oΛγo²αيO΄Υ±hͺο GH[DP―+Ύ'/~d.]Όέ‰σ>χπξάοάά“γ8lΩ²Ε5„;77ΧΤθσωηŸΗεΛ—ΐ]ΧeJι;u]χˆή|σΝΏ<~όx§ύΧf#xΰ^π}vS §§ΗμΜFŠ9u ²,7ُLΆφψ±»Χ‹Ξf ;(ψ•šMΞηv|œwiΏΐRnka¬-r@Z8ώήΤ(ψIk=i΅έnwάHsϊ1gΡFšΜ……άΐ‰7.n©’8–π Αη?<Š[nˆ»κB}}}ζ$(ϋΆ°°Πτ»MLLΰ…^pΏu/θΊ~'₯τwχοίς΅Χ^›θ@x“ΐΡ£GuΓψŒύο'“I šφ­VΟσŽNAQαρx Š ·Λ‡Ϋ†Cxυ\΅™TM—ηζsϋ4E!ΡHpš¦Αξ „φΔήfΧ¦΄ ?k1Λzνΰ'„ΠF3ΐΝˆΦ G&ψ-ΧΗι:εΣο>w)ωaM£ŽΕϋ1™ΗŸ|7npΙςcΰwkυžΛεΜ*P«ωχӟώͺͺ.~λ>€λϊ'oΌρFύζ›oώ—':MC \=tθΰ=  TU‹Eτχχ› uΉ\†$IŽΕAK‘@$θΑΑ]1\žΚ!YTM‚bu`>•ΫπIIYφέοC ez1±;χ‰ˆc~1Ÿ3Τ{Je·šΤΩ°¦sVπS€ΛdςΫNœΎό©…lyΏ››co―ϊρ=θVώR©„d2Ωt~aa;vμΐΎ}ϋ°{χn #ƒγ8d³Yhšζδ₯”θΊ~Ÿ¦iΓ{φμ9|κΤ)­ηε Ή^ψ‹_ό"ΟqάSšZHνέ»»vνjΈΉΆlΩβΪ2¬R©49•| u ί2'^O·ϊ"τΎžΠ―w o}N’„ŠΠ­ϋΕ9œ²Ψπl<—1³Ηςz§ΰ΄υn˜ΎΫNςA#!5>vΚζsΣ Έz]ρ&.Μάw5UΈ-’Βή·/†?°²Gp΅ω™Ϊοφϋ°œ~φ{Š’A" ΰš¦™΅ηΟŸΗ‹/Ύˆd2ΩJ;xJΧυίωαΨ‰l€ΏόΛΏΐβ0‘¦AqΔΦ­[›Knέƒk΅fgg›FH›–:ž;>ƒΏyς Tέ=ς'π\eϋΆgβΗ9B΄f%@oϊ&ΐ›£Όa#ƒ%㑍­}ι›3½Ν EU"5Τύ+“WoΏ2“9€ΊΔφ€η>ϋΐ ήyσVΧ>η<Ο·tψU«UΜΞΞBΧusψ‡[©wσoΆ˜V©TpβΔ <ώψγ¨Χλn$pZΧυ‡~όγ_ξΐzƒ›S θΠ‘Χ|άNF³³³θλλ3O)E©T‚ΟηkΚ`ŽAΏίJ₯βH„Ϋ·qχξ(Lη1_rθ”Š™\ytv.½£΄ϊR†ΐ’άC­?Σg‰{³N{ρ‘k]“?€4₯7υpuR S“Ι§ΞN~2•)Π)έ~›=qιc{°oG—+ψ%IΒΦ­[]ΝHYΧu‚€@ ΰψΫΉ!¦–‰D°mΫ6LLL V«9‘@λ{ϊάΉs³ho ΐ’ <  )ΛK–eά{ο½ vεRš€λ˜››sœ?`ޘІ§~5Ώ{vϊ“o<’Ωj ?ώAΰλ+ώRZ<Ζ›ίL%&ΝS ήΫAˆYžH›Γ‘v’(ͺgj*yϋL2WMQ»ZύΏ!ψτ=[pίνύπˆξλƒΟηs-Τ²―όŒœΫΦ#"›Νš™‚,ϋ3•JατιΣ( ¨T*nQƒ₯τγ‡ώiή\`rο½χ>ΛσόMvΫo†d2‰mΫΆ™+₯Εb’θάkŽΥΨ+Μ,j>v„qΧXsσE\Ν»”Υ4έ›ΝWvLΟ¦o©”+$δ=©βζψ³:ˆ³ƒpŒ 4Œύz3€4UZJ}]€„$Ÿ/υ^Έtυή³³€sε}šξξΐm>όΗGvγ–έqNJ>&Ρhρxά1½—9n™O¦]πηr9\Ήr˜ŸŸG‘P0Wz+ιΔb1δσyhšf>oΣ$]Χ?2::ΊH$~Ձψ&Π - ΰ_άμtΓ½σοl}™LΖ¬acΈΐ­ΪΕ‰'N§±°°ΰ4&ŒΙΝqܟ>|Xο@}ƒ€Aύ^Πίt“vwγΞ;οlZυc±’ΡhK•:ŸΠ•,ͺ*ώε73ψ‡ηgQVΪΎ_τίs9ρŸ‹Eƒαp`n±―Qέ·D ¬?†κFSΐν± ύe@)H.[Ψ²Ξfrεέ…rm„ΆYζν9|β>άsΛVψd±υk}>Δγq𼻘Νf±°°`t p5Κε2Nœ8sηΞ™^Ά€x<ŽΎΎ>pΧ@LEΑ©S§077‡T*e&Ž9Θ9ŽϋέΓ‡W:pίΰ`ΐ†&ΠT[ΪΣΣƒƒ6‘@0t­8³ͺ˜ιtΪ5TΘ$_ͺγ™W§ρύ—ζPΧ–W(π|1π\ Ό“‘ o*ρϊ‚Pwρ89ώιa@’(ͺ”Λ·δσε|±²=_ «ͺ\ΞuJ<ΑΗφβή[·9φνkπ pb±˜λθ6λJnmιΕzώ»ύ―ΌςŠΩΒJΦcžη166―ΧλHΊγμΩ³˜ššΒΥ«W+E y ΐΓγγγσΘop0Hΰ·ό €·Β7ξ IDAT]M@–eτφφΆτ2+Š‚T*΅€6Εr/ŸJβ_œE²€τ_‘’Θηό1ι‘„΄Η#ζ$QΘK’X’DΎΒ |γΉ:Ρ™² jΊ¨+ͺ\WUΉ^WŠ’«55\­«]εͺWT-²ί­Η/ΰ‘;·ΰφ½q}K‡β|>Ί»»]Μ4¬ΉΉΉ‹(ŠfB>ŸΗ«―ΎjΪρφΥίΎ§”bttαpΨ‘€ΕvσΜwΰζχ0ΰ‘ρρρsΨop0Hΰ!?Πt§F"άuΧ]M‘žηΡΫΫ뚐b΅Sέ:Ω₯h8}!§~3‡.nΞ Twρž[zqΓH¬₯gίΤd]]]-ύ+ΐb‚Οάά\“Ε©’“½ώψργ&ψ[ί ’··ΧΥ/0;;‹3gΞ ™LΆ"ψ}3υŽ=zήΘψϋuV«UΜΜΜ ―――!M)E‘P₯Τ,FqT% ‘PΗ΅Z1 RαΠΧνǝϋβΈwoΒ"Ή2•y:σΰ£wnΑ§Ζ‘wlC_·Ώ₯gŸΩν±X ρxά5±‡}Ο™LσσσM™’(:ζ¨ͺŠD"|>ίΠ¨=!™LΊ›MEν ‡Νπ Sχ(>ŸM$‰Sψo` ΐ’ |ΐη€ ˆ’ˆƒ:φ τx<ˆΗγKfiš†L&ƒ|>οX^μ `&UΔΉΛYΌ|6ƒW&‹ Χy85!ΐm~Όc,†±νlν €vί»8Œ%Άtς‹]œ’Ι€ΐΰυzΏσιιi\ΊtΙ$ƒ₯V|·η"‘FFFL"b΅VνξΔ‰H₯R¦CΕ₯ϊ§ό£>Ϊ!€M@ψ‘ΑΰM7ο044δΊ’Ή­φŠ%ŸΠe’ΉXQ0“,bb*SWςxεJ©eΊρZˆΐά:ΰΗήν!Œφ‡°5@ΐ+.“4‰D–ΜΠ£”šŽT§ο§R©ΰ₯KxΗ;ήΡ€ώΧλuΌϊκ«PΗ™Ν@—|λήοχcηΝΰyήΡ/P­Vρϊλ―c~~ή IΊΘε8V;°ρIΰn,Žw¬EΖώύϋW0I’ΠΣΣγš=hΧςωίθπO:…cǎaff¦U;nθΊώ₯τ?θΊώˆΡžΫ|ΟηC?A€ͺͺ ιΈ,σεX΄γ»X‹0‘Χλ5Ν9Φ}˜3§₯’(Π4ΝM3κ1œƒΟ&‰ιlpωωΟΞ΄ΏЍΕ.C覦¦0==m†’–RΉ™Ί[.—‘Οη‘ΝfQ.—Ν›ˆ­^+uΞ΅γlT•J…B‘πμ:Ϊu:‹EΌφΪkxϊι§155εΊΚΗJιηόΑ7ΏωΝ“·ήzλ»u]²Ύfjj 0my§||Φ”εd,υ=9EΪ5€Ε^‚ΜΙk}Ž}G,LX©T@q‹°&<•H$Ξvœ€›ΛIx€ΰΞ₯^+Š"FFF088θ>\Ž0›_Σ‘gχxΫo~ζ΄: ™sKUU3ͺ°Z™››ΓΩ³gqρβΕ%U{}Q…ψ{JιϊλΏώk³γξώα>B)ύοφχοίΏϊΠ‡ ͺ*.^ΌAœ›μΈT*arr²ΙιΉ\η`»Y„ρx €fՎ²Ω,Nœ8|>T*εF’€?¬C›H}τQβσω> ΰ/`k>κ&έέέlhOΎ™₯X,brrηϟ7Λk—Α]׏ψγ―ύλΗνŸχιOšp\Χυ}φχ=ψΰƒ8xπ >Œ±±1Σ™i'Z­f]ŠΪMnυ\(Βθθ¨iΦΩ{ °0a.—3‡‘ΈΘΧ8Žϋ?>¬u`si€Oψ<€m}I„ ··ύύύˆΗγ›Š ΨTžΛ—/czzz9σχ^€”~ώ±ΗϋE«Ο½ίϋ½χPJκΊNμŸσπΓ›vοήmf]Ϊ‰@UU\Ύ|Ω¬l‡(₯ΛZΓ„NΥ„Œj΅^ύu€Σi$“I(ŠkΧθψδψψxΉC›LΎτ₯/ρ„G|ˆ[I,C__Ί»»Ϋ*₯½–’λ:rΉζηη155…ΉΉΉeyς)₯OQJΏT.—ŸόΦ·ΎΥΦίόΤ§>υ JιΏsϊΌΎΎ>Δb1Θ²ŒnΈΑ,D²λ˜œœDΉ\nΉϊ[Ο±tμ•˜‚ `ll ²,›OkoUUqϊτi$“Ι₯Z½ ΰγγγΙlByμ±ΗH΅Z}7€ΐϋ–λeM3»ΊΊ‹Ε ΫΆ[ Qω|™L©T sssŽΩzK€_₯”ώˆRϊ•―~υ«//χ>ρ‰OΘ”§)₯w8ύ­žžτυυAμή½αpΨΡ „`ffΉ\nI3ΐž9Έ’jBΨΉs'@ƒ&ΐΤ~J)Ν;‡ιιi€R)Χ!΄.xίψψψ™lnσ`;€ ΰχl]ιη°QV‘P@ΐ C± VM6„₯Χj5”Λe³L9“Ι˜7₯ΥyΈ πΟQJΏ₯λϊύκWΏΊͺπΦG?ϊΡnJι3”=N+cϋφν;wξ4ΓoNΞΑωωyΜΟΟ/™5θΤ[`ΉΩƒΊcddΡhΤ‘ΰςεΛΈpα‚9±ΘE><>>ώL‡6Ή|ε+_αu]?ΰ>„ΕΠΪ}ιΖt\I’ΜAƒ›YΣ (ŠYΒΊTHo™ΰ―x\ΧυοRJφε/YY«λ‘GιΡuύ°λ·9]G ΐΘΘ$IΒΰΰ 9ήIΘf³˜5C€­ΐ!°FL–c  ―――Ι`ίύάάήxγ  s‰ƒΤ|f||ό{xλh2€χψ€Δ7υ΅ ώ*₯τ₯τ‡”ώβΏ˜^―λωΰ?θπίt] ΣďΗcΪή[ΆlΑΠΠPSX”³0!3΅ΪΡ¬ΞΑεš===l 2°g³YΌώϊλζτ#—πŸ«Υκž~ϊiΪ!€·όΥ_ύ_«Υξp?kξ€K¦α„λΟRJΗ)₯GΎπ…/δΥu=όπΓ<₯τΏθΊώΖu™f@ @,ΓΝ;͜}»6ΐΒ„¬&£“€­ΰ+)& …BqMV*•pβΔ  ΜΝΝ΅ΚΙψ(₯Λ‘#Gκx‹Κ—Ώόe/₯τ6,&έΰΈΤ ¬3ψU]Χί ”ώ’Rϊ,₯τ…G}tβz?=τΠλϊWΰ0ͺŒ‚;v "˜aB;pg† λυz[š«œ\i˜ΠλυbηΝΑΡ/ΐΒ„,³E„ΰIŒη;πφ1’φΫ;m0€Ε΄δΥ”φeL˜ ”& П’”ΎώωΟ~CΞΎ{πΑ? ΰΏΉiJύύύζΈχnΈ>ŸΟΡ ”šaΒ₯r–Σ[`©0‘Ηγq$&L₯RKEN`1B0Υ!€ŽΖΐˆSJ»°Ψ‚* @Ζb»s+1(*rΖ–0'ς'›rΐεƒ>x‹I3½NΟΗγq BΕ¦0‘½bvvΩlΆ­d‘v‡[‘ŒŽŽΆ ž?ΣΣΣΘd2Θε\­¬i,Ξ&όu‡:ςΆ”ίώνί&„<ΰ§ηΓα0vμΨaϊXoA§ Ά›5θ”>άV λ:†‡‡‹ΕšH€ωX˜°P(ΈΞMPπ±ρρρ'6οΒwnΝM-dlmΙΔΔDvttτ{†―€ΙOR«ΥΛ凑ΝfΑqœc1!~Ώ’(6΄+_ͺΓ³½¬x9Υ„ιtΪ,ev’H$ŸΟ‡B‘I’P©TœH@πΡΡΡΡωD"ρJ‡: ]ΞΖm°/—Ξ%‰κΘΘΘχ !ŽEA:6›w*Šβ:Υ‰%WεrΉ°΅"«ƒ°ζ"ΦΗΉ\Š’ ‰4 ϋہ@‘HΩl²,»uβΌott4°{χ;wŽvΰνjξ:€[O0―τs&&&tY– …Mc„X@ EQP*•FWm6δ5—Λ5ΝZu^J(•JζυΨ›”PJ!Λ2Ί»»‘ΝfαρxP­Vέϊ ή₯λϊ £££' ΅C›άά€Γ[C#h›$’Ι$I$OοΨ±cŠς ύ>€”baa’$ηyd³Ysp©}uαpΕbΡ±jΟ‰μ>…ε˜Υj΅αzμΧ-Iz{{‘Λε I’™Ρι {Ό{ttτŸ‰DΉCδά ΈΦ ίŒκ[€011q|ddδeBΘ°Ψ“ΏA²Ω¬Ή².,, ›uφyαpΥjΥuj±0BYnΟAΦμ”MZ²>ΟσˆΗγ(—ΛfΒεΊ|httt<‘H€;°q@Ύΐηΰ9l •ΎχNLL\ώΗqa1,Ϊ …BΥjΑ`Π4 X?ϋt‘p8lΆJ[ςf0ήΫnΟAϋc]Χ1??`0θz=ρxάμΰΔσΌΫuuψψθθθσ‰Db²CλtnΑΏZΰsxλ8±’Χ_ΈpaΎΏΏ‡‚ ά‹Ε9} Βz†Γa€ΣiH’Τ0³Α <ζ4,‹mk+MF)E*•‚Ηγq!ΡΥΥžηQ*•ΰρxά">,φ<—H$NwΰΪ„ΑΦόA#XΙgαzΒ₯K— έέέ?eω&£φΊ^―#“Ι "—ˁ&dΰτϋύ$Ιuͺq+M`Ή3 “Ι˜aBkoζ‡ΓπϋύΘf³πz½(—ΛN$ ψΡΡΡj"‘xΎCλB[Oπ_KΐυΤ °Φο™ššR8ŽϋΗH$K9`ρ5MΓΒΒB‘*• κυΊΉβΫUuY–αχϋ#­ΘΐΙ9Έά0‘S£WΏίH$‚L&ŸΟη! ŽŽΖΗΖƎœ?žΎέ ΰz{ kΧ›_·°°@/^Όψ³ααα*!δ^Ψ’˜ν ͺ*ŠΕ’cXŽ | …BKΞ>t#•„ νΧc%Y–ΡΣΣƒt: ΗΣj\ων”[vξάωΣD"Q;ΐ΅ΈAΉ  %¬·F°‘ς°άΧPJΙΔΔΔKΓΓΓη8Ž{―‘7 .Š’i°Ζ*φ1`,LΈœvκφVeνšΥjΉ\Ξμi QΡΫΫ‹|>Q[EΖ<8::ϊΣD"Q|«ΐυϋ[Ι?°΄¬αkžΏpαΒƒƒƒΒσόϋΰPM˜ΛεΜ.Ώιt‘P¨‘έkΡV©TP«ΥΪκΧΈšΡd֌F§φo<Ο£··ΧΞΚζ:ȏŒŽŽK$Ι· ΄Ί!pnΰυ»m$ΐF$΄ϋάΕ‹§·nέϊΈ(ŠˆΪo¦R©„J₯‚P(d† Yϋq; #‘HΓ€υMfΝh΄^‹BΜ0a½^‡$InƒSΓF„ΰεD"qq=ΐx­@οφ˜,γ΅«}οZ½g9η\Ο£Θ‰1ŠœƒAβσωˆΧλ%²,Y–‰ DE"Ωo„Ω•VQ…ZzβQUUi­V£΅ZV«U”Λeέ©ΡR©D …Β’S‚m²\§]Εσ ΟέqΗ=‘Hδϋ„Ϋœ^μχϋ166Q±cΗΔγqΧjBΦ=y©Άγ­Ί/§šphhΘ±š9'―\Ή‚‰‰ ΤλuΜΝΝΉω+ͺ>2>>ώΣΝBk\²J“u €εψ|>Δγq‹ΕΈ. …Έ`0ΘΞλυς>ŸH’Δy<NEΒσ!†Ιφv €. ΫS]ΧΝMΣ4]Σ4ͺišͺͺͺͺ(Š( #­Z­κεrY+•JZ±XΤ2™Œ–N§΅t:­ΟΞΞ……½ GΪJWύΆΞΗb1ξΆΫnϋ Žγώg7•uŠΗγ1ΑkΧJ₯\ΉbΎo½G“uuuappΠ i²–nΑ`Π,xR—/_ΖwΏϋ]·ΎiοŸΨh@! \OBh8Ησ<ΆmΫΖυχχs[ΆlβρΈFω`0(A–eήλυς’$ρ‚ ’$1ΐ3α Π/"π!„!„pŒΨ―Γ ~φΠΠΨ^gb;Φ,d Υλu­^―k!h₯RI-‹Z‘PΠ鴚J₯΄d2©ΞΞΞκ©TŠΆˆ±―%4»ώϋ­ αζΗΪ±cΊΊΊ‡MΣΐi"Q½^Η₯K—Μtέ•Œ&[ŽYΰχϋ1:: Ηƒ-[Ά »»Ϋ¬'`ΔP.—qφμY|σ›ίtΣ^!„άυ³ŸύLΩ@֐6…Ζΐσ<†‡‡ΉΎΏΏ_θιι"‘ˆ‡EŸΟ'Θ²ΜΛ²,H’$0ΰ ‚ΐ‹’(@gK=ΫθyFL0Žϊ‰Σuΐo ¦0τ30φšAšAšAšͺͺZ½^W!T«U΅R©¨εrY+‹j>ŸW3™Œ:??―ΝΜΜ(333ϊόόΌή’Mφz½οΎϋ’$ι[pι7Θ»z½^άpΓ MG­D i._ΎŒZ­Φvϋq§ξΓνΗqΈνΆΫ°oίΎ¦jB‹)‡rΉŒΛ—/γ±ΗssώΗρρρΏ\_fΝ`½€½΅Χηb±懆†„­[·Š]]]B(ƒΑ `_”$IEQ`ϋEs^8Žθyž8Žγ !Όmo’ΫŒ•ίΤ(₯v"€ ψμ‘Ξ`ρž)₯T³€‰~J©‰FΖ^UUU5Θ@­V«j­VSΛε²Z*•Τ|>―ζr95•J)W―^U§¦¦ΤΙΙI½Z­΅^ρέΞύΦoύΦY–β8―!chhΘμ7ΝΦt΄X,ΆΥuΨ"lΧΠέݍ˜O}>Ÿ+ PJQ.—‘H$πΥ―~Υ)›±¨λϊΨ“O>yu…ΪΐυώzkM£Ρ(·kΧ.~xxXά²e‹‹Ε„p8,ΡλυІ]/ ‚ ˆ‹²ΈδσΌΐσΌh^`ΐη8N „Ζͺ/X‰€4Γρg7¬ΐ§ΖΝ [4Ÿ­ώ˜›Aͺ‘¨κ" ˜{Fυz]­ΧλJ΅ZeD  %›Νͺ κμμ¬299©\ΉrE―T*t-W|·ΧάuΧ]ƒΑ`πϋ„1§F£fΏΑ]»v™ιΊvmXl:šΙdΪn?ΎTχav<44„±±±¦4bŸΟΧrΈl©TΒ‹/Ύˆο|η;NOm||όV₯Y¬Ψ7" `±γΜΨΨΏsηN±ΏΏ_κξξ#‘ˆ %ŸΟ'Κ²,z<A’$Q’$QΡPχθEƒτ’A’ρ˜7ˆ€ΐφ<Σ π³cΣ`Χg‰P«+€ίΨ[Α―Y7 ψU]ΧΝΝΠΆ7H@©ΧλšͺͺŠ’(j­VSͺΥͺb˜Ša(™LF™ŸŸWfff”‹/ͺ333šmυ’kD oΊι¦p__ίw!w9έΌ^―{φμΟσAoo―£Oΐ&lΗ!hMζD###p–ΧλmπΨ5B‘€oϋΫ8~όΈύιB½^xκ©§ Άο£m"ΰΧxΥ'+<^Νg­Ελš’QΒα0Ήωζ›₯={φx=}}}žh4κ‰D"ž@ ΰρω|²,Λ’,ΛY–=’$±MEQΑάσ<οεy^AΑΛσΌll>žηeŽγΌ<Ο{½Οx½γ8ŸυΌρΨΗqœyly={lΩΛΗy,›dΩDƒDB;fš‰`h&¦ΟΒ’±˜> ÁΙσ<Ο’œ(Š iϊ|>"‚΅ §ΥwΥ<ž››«jšφO±Xl;!dύVU ˆΕbfAV½ΗVckNΗγiκ7θ”Ηa@Ψ“††‡‡Ρίίί\,²β€ °9’έέέxφΩg›"Ÿ<ϟK$―-±Έ­˜ΘθkEλN‘H„»ρΖ₯;vH[ΆlρτττˆαpX ’Οησψ|>ΙγρH’$y<GE(ŠA<‚ x °K‚ x8Ž3Οq'σ<ο1φ^ 2Ηq^c“ p{-ΰg χ{+!°χy !^ŽγdBˆΜqœ‡β!„HvΠ€6»ΒηLSΔnžXL“7Γά’Ώ’ε0y ΄ XΝc ΩlVΏ|ωςανΫ·σΗέiΏ™5MΓάά’Ρ¨Ω=(‰8‚ΪλυšΥ„K g΅ΎΧκθιιiΉςΫ―MΧuΗΤaVϊ<==ΩΩYϋΣB"‘ψA˜Y6¬ΥκΎ _ -£ελA cccΒΠАΗΕX,&ƒAΙοχ‹ΖŠ/J’$‰’(ΖΎ$Š’ΔσΌΉqgξ9Žσπω€ŒDI’ώybbbvΎ°7Ικ:z“ˆληz½^"I'Š"KΠiπΘΫbτΦΥ’·>ΆͺΝgo@)qΊω'''qι%T«UœΏίY–›¦σ<έ»w7΅[ Ψφάά^~ωe;ωΌ–H$― ŒΏ,Ψ¨«φšv‘P€λ$ FnΓ8»£Μj―Ω rμͺΏU7Σq ΫoάΰΦt]―išVΣ4W5M«θΊ^a$`Ωj–γΊͺͺUMΣjͺͺΦψσuUUθΝcEQκΖ^QE©Χ늒(J­VSj΅š™ T©T”rΉ¬Yj.—S3™ŒšJ₯”ΩΩYujjJΝf³ϊυΎWΚε²~ρβΕ£CCCUŽγή…ζtjΜΞΞ"’^―£R©44ω΄ξeYF hh:ΊuλVτττ`­D’€&˜žžn"J鋆°l€°’7­‘¬eΖΰš^‹λΈtι’V­ViΉ\F΅ZΥk΅D"΄^―Σz½N}>Ÿ(Š.I’ξρxtMΣ4EQ4Q5ATUUUžηU#Pε8NαyήL΄±%έπ-R‚ν!:8xμίΜΆω,鿌pΜάγ±™ώkSυΓ`€b¬ό K6@­T*J©T2³³Ω¬2??―\½zU™žžVŒπŸυ»¦Χλ˜RŠcǎύυ}χέ7)IcN‚“'ObΧ]Ϋ‘³jB]ΧΝr`–Ζ»cΗ\ΌxΡtώ­ιMιqpι˜YΑύN­€λtl rqTΑfggi6›­/,,hϊ–-[΄ξξn- j‘PHσω|ͺΗγQ½^―j¨’$),ΨVΐR€y πΰ­©ΐΦhƒeοδ,cΧΫ@Vƒ±J@VΘR-6?³ϋΝΝ°σ«ΚΟjŒΥŸ©όJ.—Sι΄:??_ŸUηζζtMΣΨ—”§žzκΗχάsόΟηϋ.Z={ύύύΔ©S§°{χnΘ²l‚Ÿ$IΨ±c&''›’ŠV#Ny Μpι•ώi)•J…ΎρΖκδδ€Ύ}ϋvuΫΆmJOOΤΥΥ₯„ΓaΑησ‰@@”eYπx<’Ηγα%IbuA¬(ˆ·T.v0Rk-©Άζή‘Θμh]ύbτ $ λ: /.φT3ΌώΦ`v¬Y~6ΏΖl}¦ώC¬5j*•R’Ι€šL&΅z½N7ϊoϋμ³ΟΎ|Χ]w½/ ~δ^Ÿšš‚ͺͺΑΙ“'±{χnψύ~όlΟσ<φξέ I’–ΥyΈ•8%1brΘxc΅+εΫΡΈ’χy<ΧΧΗmΫΆMŒΗγ|4eB‚Χλ}>o$ F‘ΐσΌ Š"/Οqγ~1cv±ˆ­$Ψ©'q"kΨ λQ[W Eΐ\ψίl Βΐo”›ž}EQ4όz½ή}«“Ομ J₯ΤT*₯f2έυΉ¦,ηx->£­γΔβρψλΦo0cίΎ}Π4 ;wξ4»χX‹ˆzzz°uλVs`ΙjWVΆl•\.‡Ο~φ³φ—W³Ωlό₯—^ͺ¬δίLŽΏ η„ €··—λξξzzz„h4*„B!ΑοχσFφ  Λ2ορxAXW s3ΡΟ2ŽήlBlΉφφ† ΔξŒ4QΤ’©Χ@¬%˜ ό¬=λ €±­V«™[Ή\6› 9ω΄L&£+ŠβΪk βUΖΝ;εαααopχ~'PΚ²Œ@Σ4 7U  »»Ϋ΄Σ«ΥκŠν~ΏίοΨ'ΰΕ_Δ7Ύρ ϋ韏Ώw₯χR&΅άl«9^ Y«kY³γb±ˆb±¨MLLh‚ Τc±ΧέέΝύψp8Μϋ|>Αοχσ>Ÿ—$‰χx<¬ oh 9!–,Dζl‘GkTŒ:°Τ\ ψY“P]UU³/ ’(ζވελΥj•^3@―±^6›Υ²Ω¬^,™³Χψλͺ)œ?ΎrυκΥ?8xπΰ£<Ο»¦eΆZΕ/ωKά~ϋνΈtιj΅L3ΐšΊΛ:Ή m)^―Χόͺͺβ‰'žpςUύd5w;υςo—μΐ5=ζ8މDΈP(Δ±Nΐ>Ÿχω|ΌΧλε<OC²K™5rL`y1 €ε0`Ω}πa¬ψPUUΧ4²F Š’ΠZ­¦ Χ+•Š^.—υR©€‚΅B‘@ …‚^«Υ¨ΓΌœzύkM«:Ύώϋ@„ .΅2ϋχοG @$Αππ0AΐΝ;‡›@λ2nZ†[ ρΛ/ΏŒ―ύλ.ͺΚΠ3Ο<“^Oθ/?’ΰϊ:Aˆ1Έ’ψύ~Θΐy<N–eN’$b4%F’ΩœηyΦœ³G,(₯Δpφ™mΑΩτf[pμζΎR©P£0-—Λ¨ΧλNM>Ϋνβ³RBؐdqί}χύΆ$IίΖβθξ&C<‡,ΛΨΉs'φξέΫDΜ4«V«PeΕΰΟf³ψ³?ϋ3d³YϋSίχ«Ρͺ–jyέςϊΌΏεsΨa  „γ8ˆ’H€ύ½ͺͺ‚R EQ(λNΓ6–ΧΎ skΉΟΣλLkNχάsΟΝ>Ÿο{“ϋΝ’ίχΏύθλλsύΒ4M3‡2’ε8‚ ˜&ƒ“Τλu|ϋΫίΖK/½Τd•¨ͺΊηΨ±c“«ψŽΪpΡυςίΏœηVςΈέίn­e­{kψ܊ˆΓθ7ψBΘn§Ό··»wοΖM7έ„[nΉΕ΅ΙηJDΣ4όθG?ΒO~ς'Ϋ GŽyt5ΰ–Χd³ƒχzυΔ ΐ½R€±σ«l½ŒΟ[©‰°^ZΑšj “““ΩP(τ~ΏVBΘvϋ?P*•Νf±cΗτττ˜}Χό?ώρΑΰT>Ÿ½©©)m5ΰ_Š6―g ς՜8Ϋo;€°œΧ/—ΦΪlΈfNΘ«W―Φ4Mϋ±Xl²ΟώOΤj5œŸ9šΜI …ήxγ <ρΔΈpα‚Ϋχ«RJΘ‘#?X ΰ―τΉ@ήHcΕΦӁ·R°_««•Δz›λe&,ωά{ήσž{EQό€X«/G–eάtΣMΨΆmΊΊΊ Λ2€ΕΔ’d2‰sηΞαΜ™3KEh ”ί=rδΘγ+ΈΦuΉy6Σ ΅|νz~΅¦ΉΞ€_oRΨ(~`q,وΧλύ€λψ}ΏiΪ'=zz­VύεϊΦ“ΦjE_©nΉ;²Ξ@Z­ΏΫΎέΟ[©ΰZ8 ―₯™€Λ—/§u]n4-BΦπώ¨PJΏΟη™gž™[kΰ―υ ½Φͺψ†™ΌBX+£««ΥΦe`θυπ#Όλ]οκυω|Dω *ΎΟ2€ΏSUυΛ–$Ÿ5ώzέ@ΧΪ ·‘νχλeη“ ψv^w-œ†ΧœξΎϋξίοW„‰ς.Έ€ΫW{ΟRJ€(Κ?>υΤS™eώ†ΦΔπΧsΕ_«ίŒ¬άλό·‚FΠπψΦ[o•b±ΨM„=„mXtŠκ„,₯τ ₯τT±X<ώΒ /ΤΧ{΅Ώž*δF]Ρ―…o½ˆ`3™+ώZƒZh λωήMKkΘ롚_o°“ ς»uz]ΗσΡl +Έž· `~­Υω΅NήΩL«ώzώZƒ#ϊπv"€Νψ`η“ φβX)ΨίR€·ΛFκ ΌΡ»Θ:΅8£. €-ΐIΫ.]ΐι:½FΏιzϋ6šF°aWݍ,›YΕίLaΎkEβΧJXkaS~3ΐZ™¬ςσVφυ σ‘ φζXoΨ\€°’Χ” –ϋέoζίθν’ Co bXkխՍό»]ΰZ'½-€ρv’hη“ ό›n§ΰ΅ΠήφθΘΖ±σ;&ΐϊi›Όσ¬λχχVrϊ­‡fp-4‚Žt`S}ΟdύΖk ,zvG:Πω6VΠ‘Žt€#ιHG:‘Žt€#ιHG:‘Žt€#ιHG:‘Žt€#ιHG:‘Žt€#ιHG:‘Žt€#i-?_=0.6.0 domdf-sphinx-theme>=0.3.0 extras-require>=0.5.0 html-section>=0.3.0 seed-intersphinx-mapping>=1.2.2 sphinx>=3.0.3 sphinx-copybutton>=0.2.12 sphinx-debuginfo>=0.2.2 sphinx-licenseinfo>=0.3.1 sphinx-notfound-page>=0.7.1 sphinx-prompt>=1.1.0 sphinx-pyproject>=0.1.0 sphinx-tabs>=1.1.13 sphinx-toolbox>=3.5.0 sphinxcontrib-httpdomain>=1.7.0 sphinxemoji>=0.1.6 toctree-plus>=0.6.1 enum_tools-0.12.0/enum_tools.png000066400000000000000000000260021460302440600166470ustar00rootroot00000000000000‰PNG  IHDRΣtƒiCCPICC profile(‘}‘=HΓ@Ε_S₯"U‡vqΘP,qΤ*‘B¨Zu0Ήτ š’GΑ΅ΰΰΗbΥΑΕYWWAόqrtRt‘—ZΔxp܏wχwο‘QešΥ•4έ63©€˜Λ―ˆ‘W„Џ€„Μ,cV’π_χπυ.Ξ³όΟύ9ϊΤ‚Ε€€H<Γ Σ&^'žΪ΄ ΞϋΔQV–Uβsβ1“.HόΘuΕγ7Ξ%—ž5³™9β(±Xκ`₯ƒYΩԈ'‰cͺ¦SΎσXεΌΕY«ΦXλžό…α‚ΎΌΔušΓHa‹ BA Ta#N«NŠ… ν'}όC_"—B 9ζ± ²λƒίέZΕ‰q/)œΊ_ηcνΝΊγ|;Nσ>WzΫΏΡ¦?I―·΅Ψ0° \\·5eΈάŸ Ω”])HS(χ3ϊ¦<ΉzW½ήZϋ8}²ΤUϊ88FK”½ζσξžΞήώ=ΣκοEοr•ΓnbKGDΫΫΫ—»$Ί pHYs  šœtIMEδ(Ώ³ρ tEXtCommentCreated with GIMPW IDATxΪνwxUϊΗ?gfnΙMο!„$B(‘$τ.HǎR,Ψ{/ˆΊβͺ¬ώ¬kA]QΤ΅wEeqE₯W©‘%„τž[fΞο{“ά„D£²J™οσΜsηN93sζ|ηmηΌGπΛ-¬›0q2AΆ°ή"YZC"a’ΚΔIF"ΩZRi­JŠoMΘd’ΚΔ‰.‰€ίbψ–₯“ցrssƒΓΒΒ¦ !.Btμfύš8Iΰ4 c[uuυ»‹-zοόσΟ―<€ξχΫ¬ ΨTΊˆ²²²$›ΝφnΦ«‰“gΗ’%K˜8qbΰj—TFS5Pυ·…8ς­I$&@Q”Θ„„„α΅΅΅KV¬X!}<©#ΡT£Sό7DDDL7‰dΒD¬Vk‡‹/Ύx:Δ!€ °4ρ! ωB\jVŸ ‘0X X}›tΏΕSGΝOL)>gƒ &όΰp8β€vΎΏ. ¦‰νdί›§`zνL˜hΞvRhŸ’(*}λΥHΝ3γF&L΄ŒP ΒχθSωT»Iρ#’I&&Z†p~Ε$“ ΏšOΥIυ#ώd2Υ<&~Εtς-*Gv±;‚L&L˜h@JsΒΗ$“ ­'Σ/jq&™L˜8JDΣώ”+ αΟe)1€<Ήk_Π€NΐψƒU’( R»U+PqŒίγοǟB¦U›ήγÍkλecί>—q^Z'-¬ϋNγ½―ƒΜs=Lλk4κ=ω[P]ΓΣΟΏΗE7ίL»π€cς±Ϊ"^xϊϊs)}:΅=Τ½?ŸLAA‘$Ζ'²+w/ξΗΊM;&kiΟf…ΩJ‹΅•1P'1ζ(|$†HΪ΅3Ψ³Cαω—ύoΧpςζœˆpM#"ΙκbΎ^²²-@’Ϊc © jύ*φH&ŽλΛ•³_ΰύ—gn?±¬Œ£F&E(αν‘nF#©Σ΅ύ(Ί΅Ν5AΌΈοΓίUFƒšPΧΨ›?FΕ§?I)1dλΏυ{7)L½Tmqβ :‰1Ύλ( ˆz­ΓhNνjPε ƒFͺMZoΞ}ΰ§ΕΟΏ€ώ‚κΦP†4šW³ΧώΐΧ{"x鞾)S[ΞKΟ?Η©Σ¦“ξ·Γ@­»y!P…@7 D£ΊmΈw{γm^•R"₯τͺρH€ΐ0 Eρ=·ΡˆΔI=NαΌNŸςξ—«Έa€fŸ§ξ>d³mΰΨΕώ4$Y»ΏηWϊayΐ‚εΙ^\Ή*αg"y΅lAQH²φ|Λτ—3°άoΑςhΟόψjόjΪΠ«ψrΩ³€=eΑςw –vβ_+Ώ’JoΈNaΡvfx!–‡,X΄0ζΝY~ §Υ΄‘“<;))sςΜήkΏΉ‹βb'ΕΕNϊwςn;΄[aΦuV,‹Kn΅°%G4Ψ@¬_’2ipέ1Vž˜«QXΩΘl<‚`G{«ΒυSsΡ6ϋ_ΐπ°δ›w5y 1GΎN)ϊΘ1c–±γθο%WmΞ*,fr`χΟΜΊωrFΘ53cqk’/ζύ·?·°ž€Š*ytJ_>]Ί„`εόyθ­OxϊΞΛ7εFvμΩΝ¬λ¦2ό΄KΙ:TΡT<1rά™,Zπ5²Ycς»7ž’ΗΘ Θ+vW’Iω£TΪ·ο2ήΗ—ž~|~Ξ<Υi7{-_\εώ5””lbΚ‡Y―χ`αKx<υ|ξ\:‰w7mπς@(¬X;‡sΎ›Αεo±ψΒoy³ΧΕά²θlžY·άϋ²‚ϋήλΕCj™Φ"Ύό=ŒxλtΆ•TΆκ>T+8θ«Ε»Νaχns8@U &_0ωT |^ωΐΓ§xXσΌBο³,μ.πž³i©Κΐ±ž4Ιg_Έ™σˆδo7©άς„†ήJA©W &gZXα’,όΖΝΧ ¦ρήπs‰΅žξzΘΤu'WkmmmΥοχμ5pB ₯E2κΎ—\l­‹I5ό7κ#ψB_€κ‹MIpΏ=hΫΤΩ DΛ± FAΫ‚©υW_Ώ»Ίr„ψe3ΕΠύΜ m Ααe_ΌΒΌΥ’—f_…&§sSZŒOψ‚°B *έΟg_Χ—?ΰκίΏ²>(λλcιΌwέ[ΆΊLqΡ[Oςυ‘6<:γ"ΤfήΟ±΄΅Ϋν_‡€l`°ΛχΏpϊQλΟaHέΠΡ›T€”·½ΉΕ?°λ=Ώρ7ό—Κ2όΞmNΪ4ά‡ώ»‰T'‘t½ε ͺτνΧυ–;¨Φ•‘7!€” η6·ΘζΚΠ›'@ίαγP·.`υ–ΝΖha‘υ7£7 ~Ii4ιΉΠ°­n»a4|δόχΛ#Φλν‘Β=ΌωΖW\8υτf‰T'™Œγ¬χΓχζ™8&` mΗέ3.γ‘g^¦€ΖsΜή§Τkxϋ…GθwΝƒd$„œpοᨩy&ώς–JIq φ 0lΪ±y‹'ΕeU‡†Ρ£βXGkΤ<Νl…'ΚgQ%<2κΨΎEΝFd€ν„}¦šgΒ„I&&Ž-˜jž‰ί―Ά Q†0 Γ$“Ω$Lόερί–ρσφ]€΅OdΤ°΄kΫΖ$“‰“Υ{vQQRIdχLŒβ}οΝ%’g_¬ΆζΎϋδ2η΅wΠuƒ›/Ώ€Δ„x„/ΰήάωΉν=@xz?4W!;χ’Ϊ G˜γ„©ΗΗf2άQλΧ}ΕΠ=”αtι&cZ3T¬ω–Ÿƒnά{v°mΨt\Fσιΰ½Μ™χ΅N£‡φ'1!ΰ‰ΰ>°mΓ†γtQxˆ¬‰RY\a: ŽITνcTΫlΞ―­ίδ,ΞηκsΗ²uo‰Iš– A ²!‚‚Q@ T‘$‘5™\¨Φι$;gΟΎώ1΅΄Š½΄vL‰ζ°"ι%΄”`ΤΥTσŽΡO,αqν‘‚€ 0Ώœ geΦo€¨’ΝD·ŒL’‚‘*J²lέ!zΆ·³>λ †ΰ:”Εζ=‡ιήo0‰Q!d­^Œ•BΩή,jmΡ Κμ̟~ Z gθ~Ψ|νΓ][Ι֍λ9XTf ’[Ο^$D‡Τw+ͺ<”Γχ[ ˜0’vlbλ‡Η’ΡΊ¦Κ/tπϋ-5āˆπ) ΄IXόφ»άnžψΧk*(BQ Γ έ^ΜΰƒO£―p’φΏΜΫYρ—ήNp Ιh*(D`8š°šd:n5Ακb½ϋF,]Ζ1"3•C»7pυ5οπό‹Οi§Άς0/Ξ{q£`­ΪŜW.₯ ŽŠνά·ΊΟΎ˜=kςαV8ϋτQ|3ηΦ;•Τι|φ― "^ΰΤξ θ5Ε’uŒ’=Œœπ$QΕλιuΕ\Vήs2· Νό„ .E¨Σ₯7γFΒ“ϋ=ίVtζρpϊŒΌƒEˆξ l[υ=kj:σϊMW „kmοόg1ιן‡*@„G[ΛβΩ7W0‰qX&σώ9¬X8φ4άΖ‘„‘Β‚U΄~8€£ύΊΝΘDJDG2?»²ήε]g+>Γ0((*&&*%ϊ2 ιΑΨp;ΖΪkAQQϊ\Τ’Ϊ§΅'γηΫΌ©ΐμ±τψψQα6“LΗ,—"Ήχ’Σ©¨υ:4«θ¨†.6ΑΙLžˎ¬MμsΊQTNΤΤψ 5P£ ΔVcΕ—L˜¦Rf @υ8©σmtˆŠE` €cL†! ΅Sγt’μœ „Ε'“΅aM}r'‘,ZžΕμk TMAaΉŒ™rHπ[FΫ ‘ΨΎγQ©75(œΰ οε…Hpj`³Ξ‡1#†z‡€ωˆ¦ Έ€±ρVŒ5Χƒ’‘d^ΠμsΝNp§Dί?+A;pšΟ E&χ‘rž[Ήœήρ^wkMa.W_rAύώΚΒέόνζ›°§ oz{l’j§§‰ε₯’jήΖ ΪΤfsY¨jΓΌΪͺUxێŸ^δ,‘Ά@°aCγα׍ν†τ/¬:‡„Ά Ώs¨€ͺ²CŠfύJAΑG=U–TΪ eΰΥHέ…ά|Ζ ―ν€dLαdœξλΔRσ„¨ Sg„KΏ—Ί~ΩΧŒ›Θ»χ]‹U€*ͺXΏπ“£~α „vθΑ•WNl’'―ρ@9)ρ›πώ7ΪžZζήw3»jΜ+^£%σάΣ3Tώ„-Τ!7`H‰±εo+―ςͺ|='ΓI–Mώ€r@8=ΥE'cW†!ΙΝΪΚ–}$λ:B=Bwν‡ηgΏΝ GΠ>`ΣO Ι³$rjίGε›­hάρτλGΕ›χǟYEzΠ‘Ϋgcόt‘WBυ8η€’P'™» ’pξΓΜk/•₯μwGqή¨LΎωοgtH"-τ(\DBR!\9~3fΜdτ ^8‹sωϊ§<όΜ“G΅iSύα„‚:μt δΆΩΛ¦#BΪ"’œ4νλΔθ.gν†$wνEd χα©­bΛΆ,RΊbGAΑlφη—bu„Ρ9­#²Ά˜ΝΫv—HB¨ΒΆ¬ύtΙμ…VQΘϊμ2{€αͺ.fϋΞ\Ίfφ’hΧΟΤZ’ιΓΑ½Ϋ©±F’Á›pΩbiί.Ίή`ΟΛΙ"―¨E³Σ!-`›κ§β9ΩΌv#m:χ!*θκΌ/uτ%O!w=„2β ””!'Δc΅fp 9ΦΔΡ‡αg„0jž9ΦΔ_Eƒ€π“ο±Ν7oΒ„I&&L2™0a’Ι„ &™Lό9p»=μΚ9@euΝIχμ¦7ΟΔQ…ΛγaρʍTΥ:7Έ7]:&™’Ι„‰:£š‚5k(έ›R§tΛZ 6gγί«n-0ΐΞδρΓQ„`αk)―hmθR§tλz 6οE‘*{#‡Φn1Ιτ—½t!pVWRR\Lqq1εՍΖε˜ψ°8Ω{νt―Ϋ θδό9¬¬ŸΙCQί._W―Ϊ:P„wVψƒω­|w:ω_ηΉΉo°―T'@qQCη]| ΣΟŠbH“Ώϋ+eΗ"ΡΑ (¨aΡXˆς›ΩC°7χ0ϋ08³α€ΦεώΥΜE‹%-,€D CKŒ0m¦Ώ²2‡;”ζ½Αιύ:‚„}›—rέ w­ϋgτM‰’’x?ΨΙ ύΩΊj%%U.’RΙLοˆZ'£…δΠξlήΉ§G@f―Ψ}σΖJO _ώg%ƒΗ 'oλFrςŠ ‘ί ¬ήcJφmgUv#€°zεΚj<Δ&v’WΧTΡΠ¨Šsχ°aλNj\ΒcΪ‘Ρ³+υσΣJvlZE‘Η€΄6¬^Ε‘β*„ΐ°Q§βP~½“«’Θ#+L6šη—+ׁ5\C T4--4¨~žΓ0”Ρ•,YΝ‚οW5:uιΪΝD††Ψ6φW.’’ΩΒΡΒΝƒΦΖq\β8aΘδ.)e«K΄ΆΎADν:χγεw?%8ΜΫΌ¦ς0Οσ%ΦμάDίτ ‚m΅<χχ›˜xΣ1ydO‚ύΎαŠΏ½Ι7_Fd˜ΚβwcΙ–σΉσβρ¨€¬βΕ۟'ϋΰZBc{“ΐήx˜nΉš‡‡4$凳yξίΛΨ±.ˆΞ™ƒ±Ί ΈΆλΈυ±—Ω3δnωžλξz‘‹oΈŠ„¨V.|χβ‘ω†œ ͺswσΚOΩTu9ΐ{«œ1’'ΥΕθ­Τ}r³VπΙ7kšέί}$“†w‘5[’’E£{η Υ¬!X"gJ됈aόΈn+Υ5υ#r C2ρrΞ1€φνΪό‚„h6΄H‰¦…c‰φ˜’ι―€΅m'nΐΣOΏΒτIcHŠ%44„ΈΨ˜†› R3`Ψ™ŒΙh aJ13>_ΜC{`Q(―ΤΉυ[;$€F¨τΌιcn˜6š`›ͺΐKp‡ΣΈt|O ρ'7=4ŸΒ+&©θ€ΐ™Ώ…αηΎA€„ͺPž΅œ ›·0’g"š¬δΥ9ΟsαχqφΠtϊτκΜΜ©§°rϋx†vρφ<‹ γΰϊ—Ω”r/=5EJŸΚΤΊ<€aq©ŒΥ,=μ!Ρ΄zNiC§έέ―£DEƒ”Δœ6έvΔω]:&Σ-΅=Α֝9|ύΣZίuŸ·œ³FjYBIIΤΔ©„[Όœ‚zυ§S&™ώWŠƒk|u«Wπω«O²xcƒ‡aΜ„³Ϊ7aΤMεi£c’oξWiœΨ…΅«_’γΑ ‡L ]α6mΨ€Η0pή‡£ͺœZ$uσ/{φU“Ρ#­ώ«†β©ΒεΰΛ7g ν@Rr8Hiβ#Ω\[ƒj ٜWE§ŠΦ­[ηkLQΩΈwΓ»FcHP¬V„Τ8cό©(υ³τ΅^ο ‰ %$β$Nkuh‰=)΅αΓΧς”ρ†τΞ7Ϊ9Ε›οα«₯«λ%Τg‹—sJΏξΨ­Vβb" t4ΊklBƒE`¨I¦ΏN:„0`Ψž2Ž»«KΩ°j)O>x5³ζ2/ή!lX4ΐ«BX­*²’!`έΧ―sχσ_sζcˆΓ(.ΐΪdψ·tZQ¬MݍšM­ΏL£έn·λμΙΪF呆lQFΦ¨[Pa‘ΰ·g₯υΈΤΤΊš·P,6φmͺ­ΊS„ ƒoWl¬ί?nHo:§œ8q¨„L‚ς’\Š*‘}r€a ΩCθ7βt&­XΜ†ŸfLίdjpU{ΐ—:‘ΊΚ…%: ²κ0σ^€kξ~ŒsuCJIΩU\=χη£z·‡»ΥΒΘ3Ο₯ΗΈ&B ©c@ωέCκn]Κ£s›ΟqΡ}άε\foώ—NNι'‘ώΈ¦±D”’―–₯m\4Α“LΗ—»V|Α½ŸξeξcχεUȜdνΛ'ΆS’.™–t³mΧR’;#lέΎŠ±C»γ°j•:.·NXp W’~Xς547ΖQ x¨αq Oη»₯kΘl?‹*pΧ”³ΰγι=n2 Gε:Ι½Fσβ‹cώΈ7ο’[§dΎYΆέ0hΞΩc†P]γδƒ―–›_HZ‡D“Lǎ_ܠטiLΩϊ0Χ^s#Cϊ§cC'gϋzͺ#ϋpΥ¨~υ‚al[ύΩ"˜r>t·=>«"4†ρΓ2xύ•Χ¨έ—œMλΘ5†ςs>ωπsΞ=m"‘Ga^cCjL½a&³nΏ™ΏάNJ|»Φ/GOɘϋQ• RώυΎe)Αn³RUSK―.)X-¬ S'ž‚¦8ωΖO¨aλ ’{wqΈΈ ‰’SJb½T:|p —]ς8sηΏOΝώΝ”W»‰l۞δΈΟ”.ΆoΩF΅[ΧρQ!δΘζ`A)Σ Ά;Ω°fIέ3ˆ°{BueY;sI둁C5¨,<ΘΞ₯€g¦c1$ΑᜭtnŸX/γtgY;³©uι†FΡ©cB6ď*KςΨΉ·ˆ=»cΗwΠy{φ^Ύόa ‘Aœ7nŽ€γκώΝMΰ%ΣcΜύόcΪ˜ΣΜό„ϊqν’ΪΖ0zpŸŽLf―q:§$Ρ΅c2Ž υΣ΄™ώ‚βΈώΦΛ Μ~z yβΦύIE¦ΰΠΖOHΜɌMό/lv&L˜d2aΒ$“‰“RβάΆgΦqeηP»5 ι1{›0Ρ< ƒΒ{ ιt’qΗυΥΈ5$%s_Γ½+56ŠŠ’R’Ί‘ΝΤ”L-}@]₯¬]½†‚ Y­αIY>‡V­’¦€YUJώκΥT*ktŒ3{²²Š¨ϋf=ϋ„έJΥευΉ$ͺΧ¬Η“—OΜγχ9σf”Έ(j·lo( ¦”C«WS‘W EλWSΌ+χ˜Ϊnζ€h ΞB›uϋK\&SZ½$‡¬aΓ¨,₯ζ0YSΞ’d_yγ”Ηƒθπ’G¬½ΊSωζGH— tƒͺω_bλ›>I₯!έξ†Ζκ,dΧΈS(Ι)έΙώ^HΗLš3DKΔ jΟ«}€- ΐdJkκ+$Π‚l» U·a jάοΞ–žM;¨ώi%Άν©YτϊΪ,ͺ6nF Βυρχe8ϊdΰΞ?|IΒp ΟIDATŒsΑbΒ.8―ŒΑ΄*-ȎP΄°x¬αΣf:κjY+r@xΏŽNvnίΜξύ‡AΡθΠΉ“Ϊ’ψϊοΉ‹²pΩTE€4θ>p ν"ϋ‘Ί›][7’½0†Pi“˜Bz—ŽXκεΌΐUSΚ†uλ),­B΅Ψι”ή‹φρQψΙ+ΚέΝΖ-;©q„EΗ“Ρ£[έ+iMAMy>λΦLi₯k@]{d6:ΈΥ#„’΄ψe—hυh\aw –@t`‘hMΘ$¬V’žύeo@ΕΏίE‰‰’Έ:«JͺHmƒzΩYX+Κ(šύjb["Ÿ{αί‡Ο€¦†‘9ΠTԈ΄0 ΗJψ€Κ§†·ŸΝ²’p&ˆ^]ΐίoΊšΙ3ζμ‘έ½³[l„……"¨α₯™ΧυΦϊ&d’,_π om¨αΒρCΠ '‹ίΓ½&sσyCΌ~W)Oέ{ =O§·$ά‡ωϋ-ΧsγCOΣ75„`οϊEάxοk\qΣU΄‰²³rΡλΌυeOή{΅u9 άeyΜΊυ&zLΈŒnνc©<Ό‡›½‡Ÿ{’΄ΨVIeωη―²voe3DŒ>oi±­›FŒJ*š° …8P›qh±ΡDήq#8]«…ŸΏύ ‡έΣ­0ι ’SAΧΑj#fF Δ’„¨‚’‘ΩCΡ¬vS2m΄&Δώm«xϋϋώύή?ˆu( ’"νΌΏf €cΥZpC‡ AΚrήΧs›ϋ\³zΑ³L»υwσ¦»Jο‰μƒx|FhΙα<Φd»xfφyΔ;t “’©΅{UE/ηΥgη2υΦ{9γΤ^τιžΚΝηeΕ–ΣΩ#ψυyyYμ#…ϋ'ŸFαA(ύHNNΓ¦΅Ξ– cζp’»θΝ=&1!­7Ύν€ό 6R"νΣ7°E†΅θΥΓ’!₯€_ –¬ΫΒήƒy Ιθκu&hj3DiΨHύhֈP€‘ΡξΒ»PΒښd:ϊ”_Ο±gwα£ˆVΡu ΅ίfυ­ŸVNeήΏž jιtξ˜JrbέCcκS_…DD“\Ι‹sζ0aΤ:vμHl‡υ;« ΩVθβ܎νόΤ€p:„u{φ3ͺg|«r@DG%’όΜσΟ½Ζ¨‘½IMιHrמ­οD*%QρΙD•ϊW κδΛ!©­Λ†RνtΣM,ωEdνΩOΏξiΏxΏŽŽλΪΫu8Άšΰ‰dΧε€ΈοΙΉ|σωœ5Ό zπ­ΚA5žαΑψ+ΩuΩs~ƒ©ΝΨι3ΈqΚ(Ά―ψŽY·^Κ9—έΞϊΉυΓΛUG$Μy‰©,ϊτM.:{ w=ώ2‡J½Oέn7Ί‘ΰΠ¬ώΕ’‡SRιidΓ4δ€8Qxqή €Ex˜ζ\Ξ3‚Gη}@iMλέω΅Υ•TTT4»Έ=Ϋ>Œ.·‡‚ ‚v[vο§΄’ςΈm'UˆP[ŠB Qο0Ην3= χmcΡΪΓL;gŠb!,*Žττ4vνρΖ¬μΡq ιΙςΥ[Ιμ‹*ω;YπY6w_Ϊκ$'ϋΆfmΎΖ9§φFΡ¬DΕ%’žžDŽ«u±1i茽βAΖ]ρΗ½yΏΥ΅.Κ*kˆΑn΅ϊvνȏΆs0ΏΆ±Q&™ώΏxλr@ΔtΘΰΆ+Nε;ngτΠήθε‡Y΄t;>ύ€—HξrήyηΚjuΐI^p?ΎxwλΒ­(Zη_1@k(‘ΞΜόΫƒ Ξθ„ΠkYχγb&\uρA `λWχqΦFc¨,Νcρ·kΈϋΙgPCڸ𦻘yΫ 9Έ„+«Ύ_Θ)3₯{Rλ“Ε…G…³θώΫΙΪ8ŽΔ˜PJσχςνκ ž|Άχo¨:γ/Ι@œ[XB`€θπ―cΗ€ΆμΟ/dε¦œyάMΊpR倨“bEχ°/Ώ‘XθΠ)―—Mθ5lΪΌ—ήLσΊeφΐ&%АμΫ½“Β*$‚¨ψ$γΒΕυZ²Άο€ΚιFΥ¬$§¦`iΤpέ5εμΨΉ§nέ–”ΔX€ŸXjMέYA֎=ΤΊ=hV©i°Ϋ¦pΣΕξάB:ΆΖfmt­©uςιβεœΪΏ'±‘ΗΌνfΗ,ͺjœؚέWTZNDhπ1%™Μ&ŽY΄D$€Θ°γς™Μ^γ&L˜d2aΒ$“ &™L˜0a’Ι„ “L&L˜d2aβΔ„4ΙdΒ„)™L˜8>€US29Νz1a’1t]7š¨wςW%“aΫΜͺ3a’1JKK«|2šόΆH&Y]]ύŽYu&L4ΖΊuλωdΰφήπ#”lJ& Θ Όηρxv˜ΥgΒD½Tͺ~κ©§rΰς™Bn?R5O¦K.Ή€rΙ’%WΈ\έf5š0‰TZύΐόΌxρβj ¨jόΥH:Υe ¬ΧτΞ;οΤz<žβγγ »έ£iZ Βτϊ™8iœ %%%•Λ–-Ϋ7sζΜ¬χίΏο˜₯ΰ0ηϋ-σΛSG*α#R™¬@ $Ι@; μx‡Ί+~η™0q"Aϊ9<>‰TϋΰPδ#™«ŽLš_ώ'WψΛEU·ΝX|Ν”V&NTΤ9ά>ΥΤG¦\/*|œπψΫMšo₯NΒθ>¦UωNΒχΏά'™ CέύaJ)Η³4jJ&ΓgΥψ$S±E>~Τ9!κΛК)Πγ+€άwp]a>"YšIζτε&Žwψ·γ:2Ή}\¨ςI£ ίz’‘k\4S`ύdρ-v‰¬~DRMIdβ—TΊ‘κ\β΅ΎGxςZ"“?©TŸ*¨ωΩIŠI$' ‘ό΅ί’7!‘ό5;ΗίSηO ιΕ3qςΙ©#M%RkΘΤtK$2‰eβDuD4GΩ±ΏFa’Ζ„‰_ο1πθ€Ώ§Ž4ΊIENDB`‚enum_tools-0.12.0/enum_tools/000077500000000000000000000000001460302440600161415ustar00rootroot00000000000000enum_tools-0.12.0/enum_tools/__init__.py000066400000000000000000000030661460302440600202570ustar00rootroot00000000000000#!/usr/bin/env python3 # # __init__.py """ Tools to expand Python's enum module. """ # # Copyright (c) 2020 Dominic Davis-Foster # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # stdlib from enum import Enum, Flag, IntFlag # this package from enum_tools.custom_enums import AutoNumberEnum, DuplicateFreeEnum, IntEnum, OrderedEnum, StrEnum from enum_tools.documentation import DocumentedEnum, document_enum, document_member __author__: str = "Dominic Davis-Foster" __copyright__: str = "2020 Dominic Davis-Foster" __license__: str = "GNU Lesser General Public License v3 or later (LGPLv3+)" __version__: str = "0.12.0" __email__: str = "dominic@davis-foster.co.uk" __all__ = [ "Enum", "IntEnum", "StrEnum", "AutoNumberEnum", "OrderedEnum", "DuplicateFreeEnum", "Flag", "IntFlag", "DocumentedEnum", "document_enum", "document_member", ] enum_tools-0.12.0/enum_tools/autoenum.py000066400000000000000000000470321460302440600203560ustar00rootroot00000000000000#!/usr/bin/env python3 # # autoenum.py """ A Sphinx directive for documenting :class:`Enums ` in Python. """ # # Copyright (c) 2020-2022 Dominic Davis-Foster # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # Parts based on https://github.com/sphinx-doc/sphinx # | Copyright (c) 2007-2020 by the Sphinx team (see AUTHORS file). # | BSD Licensed # | All rights reserved. # | # | Redistribution and use in source and binary forms, with or without # | modification, are permitted provided that the following conditions are # | met: # | # | * Redistributions of source code must retain the above copyright # | notice, this list of conditions and the following disclaimer. # | # | * Redistributions in binary form must reproduce the above copyright # | notice, this list of conditions and the following disclaimer in the # | documentation and/or other materials provided with the distribution. # | # | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # | HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # stdlib from contextlib import suppress from enum import Enum from typing import Any, Dict, List, Optional, Tuple, get_type_hints # 3rd party import sphinx # nodep from docutils.nodes import Element # nodep from sphinx.application import Sphinx # nodep from sphinx.domains import ObjType # nodep from sphinx.domains.python import PyClasslike, PyXRefRole # nodep from sphinx.environment import BuildEnvironment # nodep from sphinx.errors import PycodeError # nodep from sphinx.ext.autodoc import ( # nodep ALL, INSTANCEATTR, SUPPRESS, AttributeDocumenter, ClassDocumenter, ClassLevelDocumenter, Documenter, ObjectMember, logger ) from sphinx.locale import _ # nodep from sphinx.pycode import ModuleAnalyzer # nodep from sphinx.util.inspect import memory_address_re, safe_getattr # nodep from sphinx_toolbox.more_autodoc import ObjectMembers # nodep from sphinx_toolbox.more_autodoc.typehints import format_annotation # nodep from sphinx_toolbox.utils import add_fallback_css_class # nodep from sphinx_toolbox.utils import unknown_module_warning # nodep try: # 3rd party from sphinx.util.typing import stringify_annotation as stringify_typehint # type: ignore[attr-defined] except ImportError: from sphinx.util.typing import stringify as stringify_typehint # this package from enum_tools import __version__, documentation from enum_tools.utils import get_base_object, is_enum, is_flag __all__ = ["EnumDocumenter", "EnumMemberDocumenter", "setup", "FlagDocumenter", "PyEnumXRefRole"] documentation.INTERACTIVE = True _filename_set_attribute = "filename_set" if sphinx.version_info < (4, 0) else "record_dependencies" def _begin_generate( documenter: Documenter, real_modname: Optional[str] = None, check_module: bool = False, ) -> Optional[str]: """ Boilerplate for the top of ``generate`` in :class:`sphinx.ext.autodoc.Documenter` subclasses. :param documenter: :param real_modname: :param check_module: :return: The ``sourcename``, or :py:obj:`None` if certain conditions are met, to indicate that the Documenter class should exit early. """ # Do not pass real_modname and use the name from the __module__ # attribute of the class. # If a class gets imported into the module real_modname # the analyzer won't find the source of the class, if # it looks in real_modname. if not documenter.parse_name(): # need a module to import unknown_module_warning(documenter) return None # now, import the module and get object to document if not documenter.import_object(): return None # If there is no real module defined, figure out which to use. # The real module is used in the module analyzer to look up the module # where the attribute documentation would actually be found in. # This is used for situations where you have a module that collects the # functions and classes of internal submodules. guess_modname = documenter.get_real_modname() documenter.real_modname = real_modname or guess_modname # try to also get a source code analyzer for attribute docs try: documenter.analyzer = ModuleAnalyzer.for_module(documenter.real_modname) # parse right now, to get PycodeErrors on parsing (results will # be cached anyway) documenter.analyzer.find_attr_docs() except PycodeError as err: # pragma: no cover logger.debug("[autodoc] module analyzer failed: %s", err) # no source file -- e.g. for builtin and C modules documenter.analyzer = None # type: ignore[assignment] # at least add the module.__file__ as a dependency if hasattr(documenter.module, "__file__") and documenter.module.__file__: filename_set = getattr(documenter.directive, _filename_set_attribute) filename_set.add(documenter.module.__file__) else: filename_set = getattr(documenter.directive, _filename_set_attribute) filename_set.add(documenter.analyzer.srcname) if documenter.real_modname != guess_modname: # Add module to dependency list if target object is defined in other module. with suppress(PycodeError): analyzer = ModuleAnalyzer.for_module(guess_modname) filename_set = getattr(documenter.directive, _filename_set_attribute) filename_set.add(analyzer.srcname) # check __module__ of object (for members not given explicitly) if check_module: if not documenter.check_module(): return None sourcename = documenter.get_sourcename() # make sure that the result starts with an empty line. This is # necessary for some situations where another directive preprocesses # reST and no starting newline is present documenter.add_line('', sourcename) return sourcename class EnumDocumenter(ClassDocumenter): r""" Sphinx autodoc :class:`~sphinx.ext.autodoc.Documenter` for documenting :class:`~enum.Enum`\s. """ objtype = "enum" directivetype = "enum" priority = 20 class_xref = ":class:`~enum.Enum`" @classmethod def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any) -> bool: """ Called to see if a member can be documented by this documenter. :param member: :param membername: :param isattr: :param parent: """ return is_enum(member) and not is_flag(member) def document_members(self, all_members: bool = False) -> None: """ Generate reST for member documentation. :param all_members: If :py:obj:`True`, document all members, otherwise document those given by ``self.options.members``. .. latex:clearpage:: """ if self.doc_as_attr: return # print(self.directive.result) # input("> ") # set current namespace for finding members self.env.temp_data["autodoc:module"] = self.modname if self.objpath: self.env.temp_data["autodoc:class"] = self.objpath[0] want_all = all_members or self.options.inherited_members or self.options.members is ALL # find out which members are documentable members_check_module, members = self.get_object_members(want_all) non_enum_members: List[ObjectMember] = [] for member in members: if isinstance(member, ObjectMember): if member.__name__ not in self.object.__members__.keys(): non_enum_members.append(member) else: member_name = member[0] if member_name not in self.object.__members__.keys(): non_enum_members.append(ObjectMember(*member)) user_option_undoc_members = self.options.undoc_members # Document enums first self.options.undoc_members = True # type: ignore[attr-defined] enum_members = [ObjectMember(name=var.name, obj=var) for var in self.object] self._do_document_members( enum_members, want_all, members_check_module, description="Valid values are as follows:", ) # Document everything else self.options.undoc_members = user_option_undoc_members # type: ignore[attr-defined] methods_text = ( f"The {self.class_xref} and its members " f"{'also ' if enum_members else ''}have the following methods:" ) self._do_document_members( non_enum_members, want_all, members_check_module, description=methods_text, ) def _do_document_members( self, members: ObjectMembers, want_all: bool, members_check_module: bool, description: str, ) -> None: # remove members given by exclude-members if self.options.exclude_members: new_members = [] for member in members: if not isinstance(member, ObjectMember): member = ObjectMember(*member) if (self.options.exclude_members is ALL or member.__name__ not in self.options.exclude_members): new_members.append(member) members = new_members # document non-skipped members memberdocumenters: List[Tuple[Documenter, bool]] = [] description_added = False for (mname, member, isattr) in self.filter_members(members, want_all): if not description_added: self.add_line(description, self.sourcename) self.add_line('', self.sourcename) description_added = True # give explicitly separated module name, so that members # of inner classes can be documented full_mname = self.modname + "::" + '.'.join(self.objpath + [mname]) documenter: Documenter if isinstance(member, Enum) and member in self.object: documenter = EnumMemberDocumenter(self.directive, full_mname, self.indent) else: classes = [ cls for cls in self.documenters.values() if cls.can_document_member(member, mname, isattr, self) ] if not classes: # don't know how to document this member continue # prefer the documenter with the highest priority classes.sort(key=lambda cls: cls.priority) documenter = classes[-1](self.directive, full_mname, self.indent) memberdocumenters.append((documenter, isattr)) member_order = self.options.member_order or self.env.config.autodoc_member_order if member_order == "groupwise": # sort by group; relies on stable sort to keep items in the # same group sorted alphabetically memberdocumenters.sort(key=lambda e: e[0].member_order) elif member_order == "bysource" and self.analyzer: # sort by source order, by virtue of the module analyzer tagorder = self.analyzer.tagorder def keyfunc(entry: Tuple[Documenter, bool]) -> int: fullname = entry[0].name.split("::")[1] return tagorder.get(fullname, len(tagorder)) memberdocumenters.sort(key=keyfunc) for documenter, isattr in memberdocumenters: documenter.generate( all_members=True, real_modname=self.real_modname, check_module=members_check_module and not isattr, ) # reset current objects self.env.temp_data["autodoc:module"] = None self.env.temp_data["autodoc:class"] = None real_modname: str def generate( self, more_content: Optional[Any] = None, real_modname: Optional[str] = None, check_module: bool = False, all_members: bool = False, ) -> None: """ Generate reST for the object given by *self.name*, and possibly for its members. :param more_content: Additional content to include in the reST output. :param real_modname: Module name to use to find attribute documentation. :param check_module: If :py:obj:`True`, only generate if the object is defined in the module name it is imported from. :param all_members: If :py:obj:`True`, document all members. """ ret = _begin_generate(self, real_modname, check_module) if ret is None: return sourcename = ret # Set sourcename as instance variable to avoid passing it around; it will get deleted later self.sourcename = sourcename # generate the directive header and options, if applicable self.add_directive_header("(value)") self.add_line('', sourcename) self.indent += self.content_indent # add all content (from docstrings, attribute docs etc.) self.add_content(more_content) member_type = get_base_object(self.object) if member_type is not object: # Show the type of the members self.add_line(f":Member Type: {format_annotation(member_type)}", self.sourcename) self.add_line('', self.sourcename) # document members, if possible self.document_members(all_members) del self.sourcename class FlagDocumenter(EnumDocumenter): r""" Sphinx autodoc :class:`~sphinx.ext.autodoc.Documenter` for documenting :class:`~enum.Flag`\s. .. autosummary-widths:: 55/100 """ objtype = "flag" directivetype = "flag" priority = 15 class_xref = ":class:`~enum.Flag`" @classmethod def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any) -> bool: """ Called to see if a member can be documented by this documenter. :param member: :param membername: :param isattr: :param parent: """ return is_flag(member) class EnumMemberDocumenter(AttributeDocumenter): """ Sphinx autodoc :class:`~sphinx.ext.autodoc.Documenter` for documenting :class:`~enum.Enum` members. """ def import_object(self, raiseerror: bool = False) -> bool: """ Import the object given by ``self.modname`` and ``self.objpath`` and set it as ``self.object``. :param raiseerror: :returns: :py:obj:`True` if successful, :py:obj:`False` if an error occurred. .. latex:clearpage:: """ return Documenter.import_object(self, raiseerror=raiseerror) def generate( self, more_content: Optional[Any] = None, real_modname: Optional[str] = None, check_module: bool = False, all_members: bool = False ) -> None: """ Generate reST for the object given by ``self.name``, and possibly for its members. :param more_content: Additional content to include in the reST output. :param real_modname: Module name to use to find attribute documentation. :param check_module: If :py:obj:`True`, only generate if the object is defined in the module name it is imported from. :param all_members: If :py:obj:`True`, document all members. .. versionchanged:: 0.8.0 Multiline docstrings are now correctly represented in the generated output. """ ret = _begin_generate(self, real_modname, check_module) if ret is None: return sourcename = ret # generate the directive header and options, if applicable self.add_directive_header('') self.add_line('', sourcename) # e.g. the module directive doesn't have content self.indent += self.content_indent # Add the value's docstring if self.object.__doc__ and self.object.__doc__ != self.object.__class__.__doc__: # Lines of multiline docstrings need to be added one by one. for line in self.object.__doc__.splitlines(): self.add_line(line, sourcename) self.add_line('', sourcename) def add_directive_header(self, sig: str) -> None: """ Add the directive header for the Enum member. :param sig: """ ClassLevelDocumenter.add_directive_header(self, sig) sourcename = self.get_sourcename() if not self.options.annotation: # obtain type annotation for this attribute try: annotations = get_type_hints(self.parent) except NameError: # Failed to evaluate ForwardRef (maybe TYPE_CHECKING) annotations = safe_getattr(self.parent, "__annotations__", {}) except (TypeError, KeyError, AttributeError): # KeyError = a broken class found (refs: https://github.com/sphinx-doc/sphinx/issues/8084) # AttributeError is raised on 3.5.2 (fixed by 3.5.3) annotations = {} if self.objpath[-1] in annotations: objrepr = stringify_typehint(annotations.get(self.objpath[-1])) self.add_line(" :type: " + objrepr, sourcename) else: key = ('.'.join(self.objpath[:-1]), self.objpath[-1]) if self.analyzer and key in self.analyzer.annotations: self.add_line(" :type: " + self.analyzer.annotations[key], sourcename) elif self.options.annotation is SUPPRESS: pass else: self.add_line(" :annotation: %s" % self.options.annotation, sourcename) if not self.options.annotation: with suppress(Exception): if self.object is not INSTANCEATTR: # Workaround for https://github.com/sphinx-doc/sphinx/issues/9272 # which broke Enum displays in 4.1.0 objrepr = memory_address_re.sub('', repr(self.object)).replace('\n', ' ') self.add_line(f' :value: {objrepr}', self.get_sourcename()) class PyEnumXRefRole(PyXRefRole): """ XRefRole for Enum/Flag members. .. versionadded:: 0.4.0 .. autosummary-widths:: 40/100 """ def process_link( self, env: BuildEnvironment, refnode: Element, has_explicit_title: bool, title: str, target: str, ) -> Tuple[str, str]: """ Called after parsing title and target text, and creating the reference node (given in ``refnode``). This method can alter the reference node and must return a new (or the same) ``(title, target)`` tuple. :param env: :param refnode: :param has_explicit_title: :param title: :param target: :rtype: .. latex:clearpage:: """ refnode["py:module"] = env.ref_context.get("py:module") refnode["py:class"] = env.ref_context.get("py:class") if not has_explicit_title: title = title.lstrip('.') # only has a meaning for the target target = target.lstrip("~+") # only has a meaning for the title # if the first character is a tilde, don't display the module/class # parts of the contents if title[0:1] == '~': title = '.'.join(title[1:].split('.')[-2:]) elif title[0:1] == '+': title = title[1:] dot = title.rfind('.') if dot != -1: title = title[dot + 1:] # if the first character is a dot, search more specific namespaces first # else search builtins first if target[0:1] == '.': target = target[1:] refnode["refspecific"] = True return title, target def setup(app: Sphinx) -> Dict[str, Any]: """ Setup Sphinx Extension. :param app: """ app.registry.domains["py"].object_types["enum"] = ObjType(_("enum"), "enum", "class", "obj") app.add_directive_to_domain("py", "enum", PyClasslike) app.add_role_to_domain("py", "enum", PyXRefRole()) app.registry.domains["py"].object_types["flag"] = ObjType(_("flag"), "flag", "enum", "class", "obj") app.add_directive_to_domain("py", "flag", PyClasslike) app.add_role_to_domain("py", "flag", PyXRefRole()) app.add_role_to_domain("py", "enum:mem", PyEnumXRefRole()) app.add_role_to_domain("py", "enum:member", PyEnumXRefRole()) app.add_role_to_domain("py", "flag:mem", PyEnumXRefRole()) app.add_role_to_domain("py", "flag:member", PyEnumXRefRole()) app.add_autodocumenter(EnumDocumenter) app.add_autodocumenter(FlagDocumenter) app.connect("object-description-transform", add_fallback_css_class({"enum": "class", "flag": "class"})) return { "version": __version__, "parallel_read_safe": True, "parallel_write_safe": True, } enum_tools-0.12.0/enum_tools/custom_enums.py000066400000000000000000000157741460302440600212520ustar00rootroot00000000000000#!/usr/bin/env python3 # # custom_enums.py """ Custom subclasses of :class:`enum.Enum` and :class:`enum.Flag`. """ # # Copyright (c) 2020-2021 Dominic Davis-Foster # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # Parts based on https://docs.python.org/3/library/enum.html # and https://github.com/python/cpython/pull/22221 # and https://github.com/python/cpython/pull/22337 # PSF License 2.0 # # stdlib import sys from enum import Enum, Flag, IntFlag from typing import Any, Iterator, List __all__ = [ "MemberDirEnum", "IntEnum", "StrEnum", "AutoNumberEnum", "OrderedEnum", "DuplicateFreeEnum", "IterableFlag", "IterableIntFlag", ] if sys.version_info >= (3, 11): # pragma: no cover # stdlib from enum import _high_bit def _power_of_two(value: int) -> bool: # From CPython. Removed in https://github.com/python/cpython/commit/8cef9c0f92720f6810be1c74e00f611acb4b8b1e if value < 1: return False return value == 2**_high_bit(value) def _decompose(flag, value): # noqa: MAN001,MAN002 """ Extract all members from the value. """ # From CPython. Removed in https://github.com/python/cpython/pull/24215 # _decompose is only called if the value is not named not_covered = value # issue29167: wrap accesses to _value2member_map_ in a list to avoid race # conditions between iterating over it and having more pseudo- # members added to it flags_to_check = [] if value < 0: # only check for named flags for v, m in list(flag._value2member_map_.items()): if m.name is not None: flags_to_check.append((m, v)) else: # check for named flags and powers-of-two flags for v, m in list(flag._value2member_map_.items()): if m.name is not None or _power_of_two(v): flags_to_check.append((m, v)) members = [] for member, member_value in flags_to_check: if member_value and member_value & value == member_value: members.append(member) not_covered &= ~member_value if not members and value in flag._value2member_map_: members.append(flag._value2member_map_[value]) members.sort(key=lambda m: m._value_, reverse=True) if len(members) > 1 and members[0].value == value: # we have the breakdown, don't need the value member itself members.pop(0) return members, not_covered else: # pragma: no cover (py310+) # stdlib from enum import _decompose # type: ignore[attr-defined] class MemberDirEnum(Enum): """ :class:`~enum.Enum` which includes attributes as well as methods. This will be part of the :mod:`enum` module starting with Python 3.10. .. seealso:: Pull request :pull:`19219 ` by Angelin BOOZ, which added this to CPython. .. versionadded:: 0.6.0 """ def __dir__(self) -> List[str]: return super().__dir__() + [m for m in self.__dict__ if m[0] != '_'] class IntEnum(int, Enum): """ :class:`~enum.Enum` where members are also (and must be) ints. """ # def __int__(self): # return self.value # def __eq__(self, other): # if int(self) == other: # return True # else: # return super().__eq__(other) class StrEnum(str, Enum): """ :class:`~enum.Enum` where members are also (and must be) strings. """ def __str__(self) -> str: return self.value def __new__(cls, *values): # noqa: D102 if len(values) > 3: raise TypeError(f'too many arguments for str(): {values!r}') if len(values) == 1: # it must be a string if not isinstance(values[0], str): raise TypeError(f'{values[0]!r} is not a string') if len(values) > 1: # check that encoding argument is a string if not isinstance(values[1], str): raise TypeError(f'encoding must be a string, not {values[1]!r}') if len(values) > 2: # check that errors argument is a string if not isinstance(values[2], str): raise TypeError(f'errors must be a string, not {values[2]!r}') value = str(*values) member = str.__new__(cls, value) member._value_ = value return member # def __repr__(self): # return self.value # def __eq__(self, other): # if str(self) == other: # return True # else: # return super().__eq__(other) class AutoNumberEnum(Enum): """ :class:`~enum.Enum` that automatically assigns increasing values to members. """ def __new__(cls, *args, **kwds) -> Any: # noqa: D102 value = len(cls.__members__) + 1 obj = object.__new__(cls) obj._value_ = value return obj class OrderedEnum(Enum): """ :class:`~enum.Enum` that adds ordering based on the values of its members. """ def __ge__(self, other) -> bool: # noqa: MAN001 if self.__class__ is other.__class__: return self._value_ >= other._value_ return NotImplemented def __gt__(self, other) -> bool: # noqa: MAN001 if self.__class__ is other.__class__: return self._value_ > other._value_ return NotImplemented def __le__(self, other) -> bool: # noqa: MAN001 if self.__class__ is other.__class__: return self._value_ <= other._value_ return NotImplemented def __lt__(self, other) -> bool: # noqa: MAN001 if self.__class__ is other.__class__: return self._value_ < other._value_ return NotImplemented class DuplicateFreeEnum(Enum): """ :class:`~enum.Enum` that disallows duplicated member names. """ def __init__(self, *args) -> None: cls = self.__class__ if any(self.value == e.value for e in cls): a = self.name e = cls(self.value).name raise ValueError(f"aliases are not allowed in DuplicateFreeEnum: {a!r} --> {e!r}") class IterableFlag(Flag): """ :class:`~enum.Flag` with support for iterating over members and member combinations. This functionality was added to Python 3.10's :mod:`enum` module in :pull:`22221 `. .. versionadded:: 0.5.0 """ def __iter__(self) -> Iterator[Flag]: """ Returns members in definition order. :rtype: .. latex:clearpage:: """ members, extra_flags = _decompose(self.__class__, self.value) return (m for m in members if m._value_ != 0) class IterableIntFlag(IntFlag): """ :class:`~enum.IntFlag` with support for iterating over members and member combinations. This functionality was added to Python 3.10's :mod:`enum` module in :pull:`22221 `. .. versionadded:: 0.5.0 """ def __iter__(self) -> Iterator[IntFlag]: """ Returns members in definition order. """ members, extra_flags = _decompose(self.__class__, self.value) return (m for m in members if m._value_ != 0) enum_tools-0.12.0/enum_tools/demo.py000066400000000000000000000032771460302440600174500ustar00rootroot00000000000000# noqa: D100 # stdlib from enum import IntEnum, IntFlag from typing import List # this package import enum_tools.documentation __all__ = ["People", "NoMethods", "NoMemberDoc", "StatusFlags"] enum_tools.documentation.INTERACTIVE = True @enum_tools.documentation.document_enum class People(IntEnum): """ An enumeration of people. """ Bob = bob = 1 # noqa # doc: A person called Bob # doc: another doc # isort: ignore Alice = 2 # doc: A person called Alice Carol = 3 """ A person called Carol. This is a multiline docstring. """ @classmethod def iter_values(cls): # noqa: MAN002 """ Iterate over the values of the Enum. """ return iter(cls) # pragma: no cover #: A person called Dennis Dennis = 4 @classmethod def as_list(cls) -> List: """ Return the Enum's members as a list. """ return list(cls) # pragma: no cover @enum_tools.documentation.document_enum class NoMethods(IntEnum): """ An enumeration of people without any methods. """ Bob = bob = 1 # noqa # doc: A person called Bob # doc: another doc # isort: ignore Alice = 2 # doc: A person called Alice Carol = 3 # doc: A person called Carol @enum_tools.documentation.document_enum class NoMemberDoc(IntEnum): """ An enumeration of people without any member docstrings. """ Bob = bob = 1 Alice = 2 Carol = 3 @enum_tools.documentation.document_enum class StatusFlags(IntFlag): """ An enumeration of status codes. """ Running = 1 # doc: The system is running. Stopped = 2 # doc: The system has stopped. Error = 4 # doc: An error has occurred. def has_errored(self) -> bool: # pragma: no cover """ Returns whether the operation has errored. """ return (self & 4) == self.Error enum_tools-0.12.0/enum_tools/documentation.py000066400000000000000000000254371460302440600213770ustar00rootroot00000000000000#!/usr/bin/env python3 # # documentation.py """ Decorators to add docstrings to enum members from comments. """ # # Copyright (c) 2020-2021 Dominic Davis-Foster # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # stdlib import ast import inspect import re import sys import tokenize import warnings from enum import Enum, EnumMeta from textwrap import dedent from typing import Iterable, Iterator, List, Optional, Sequence, Tuple, TypeVar, Union # 3rd party import pygments.token # type: ignore[import] from pygments.lexers.python import PythonLexer # type: ignore[import] __all__ = [ "get_tokens", "document_enum", "document_member", "parse_tokens", "get_base_indent", "DocumentedEnum", "get_dedented_line", "MultipleDocstringsWarning", ] _lexer = PythonLexer() INTERACTIVE = bool(getattr(sys, "ps1", sys.flags.interactive)) EnumType = TypeVar("EnumType", bound=EnumMeta) def get_tokens(line: str) -> List[Tuple]: """ Returns a list ot tokens generated from the given Python code. :param line: Line of Python code to tokenise. """ return list(_lexer.get_tokens(line)) def _docstring_from_expr(expr: ast.Expr) -> Optional[str]: """ Check if the expression is a docstring. :param expr: :returns: The cleaned docstring text if it is a docstring, or :py:obj:`None` if it isn't. """ # might be docstring docstring_node = expr.value if isinstance(docstring_node, ast.Constant) and isinstance(docstring_node.value, str): text = docstring_node.value elif isinstance(docstring_node, ast.Str): text = docstring_node.s else: # not a docstring return None return inspect.cleandoc(text) def _docstring_from_eol_comment( source: str, node: Union[ast.Assign, ast.AnnAssign], ) -> Optional[str]: """ Search for an end-of-line docstring comment (starts with ``# doc:``). :param source: The source of the Enum class. :param node: The AST node for the Enum member. """ toks = _tokenize_line(source.split('\n')[node.lineno - 1]) comment_toks = [x for x in list(toks) if x.type == tokenize.COMMENT] if comment_toks: for match in re.finditer(r"(doc:\s*)([^#]*)(#|$)", comment_toks[0].string): if match.group(2): return match.group(2).rstrip() return None def _docstring_from_sphinx_comment( source: str, node: Union[ast.Assign, ast.AnnAssign], ) -> Optional[str]: """ Search for a Sphinx-style docstring comment (starts with ``#:``). :param source: The source of the Enum class. :param node: The AST node for the Enum member. """ for offset in range(node.lineno - 1, 0, -1): line = source.split('\n')[offset - 1] if line.strip(): # contains non-whitespace try: toks = _tokenize_line(line) except (tokenize.TokenError, SyntaxError): return None # print(list(toks)) comment_toks = [x for x in list(toks) if x.type == tokenize.COMMENT] if comment_toks: for match in re.finditer(r"(#:\s*)(.*)", comment_toks[0].string): if match.group(2): return match.group(2).rstrip() return None return None def _tokenize_line(line: str) -> List[tokenize.TokenInfo]: """ Tokenize a single line of Python source code. :param line: """ def yielder() -> Iterator[str]: yield line return list(tokenize.generate_tokens(yielder().__next__)) class MultipleDocstringsWarning(UserWarning): """ Warning emitted when multiple docstrings are found for a single Enum member. .. versionadded:: 0.8.0 :param member: :param docstrings: The list of docstrings found for the member. """ #: The member with multiple docstrings. member: Enum #: The list of docstrings found for the member. docstrings: Iterable[str] def __init__(self, member: Enum, docstrings: Iterable[str] = ()): self.member = member self.docstrings = docstrings def __str__(self) -> str: member_full_name = '.'.join([ self.member.__class__.__module__, self.member.__class__.__name__, self.member.name, ]) return f"Found multiple docstrings for enum member <{member_full_name}>" def document_enum(an_enum: EnumType) -> EnumType: """ Document all members of an enum by parsing a docstring from the Python source.. The docstring can be added in several ways: #. A comment at the end the line, starting with ``doc:``: .. code-block:: python Running = 1 # doc: The system is running. #. A comment on the previous line, starting with ``#:``. This is the format used by Sphinx. .. code-block:: python #: The system is running. Running = 1 #. A string on the line *after* the attribute. This can be used for multiline docstrings. .. code-block:: python Running = 1 \"\"\" The system is running. Hello World \"\"\" If more than one docstring format is found for an enum member a :exc:`MultipleDocstringsWarning` is emitted. :param an_enum: An :class:`~enum.Enum` subclass :type an_enum: :class:`enum.Enum` :returns: The same object passed as ``an_enum``. This allows this function to be used as a decorator. :rtype: :class:`enum.Enum` .. versionchanged:: 0.8.0 Added support for other docstring formats and multiline docstrings. """ if not isinstance(an_enum, EnumMeta): raise TypeError(f"'an_enum' must be an 'Enum', not {type(an_enum)}!") if not INTERACTIVE: return an_enum func_source = dedent(inspect.getsource(an_enum)) func_source_tree = ast.parse(func_source) assert len(func_source_tree.body) == 1 module_body = func_source_tree.body[0] assert isinstance(module_body, ast.ClassDef) class_body = module_body.body for idx, node in enumerate(class_body): targets = [] if isinstance(node, ast.Assign): for t in node.targets: assert isinstance(t, ast.Name) targets.append(t.id) elif isinstance(node, ast.AnnAssign): assert isinstance(node.target, ast.Name) targets.append(node.target.id) else: continue assert isinstance(node, (ast.Assign, ast.AnnAssign)) # print(targets) if idx + 1 == len(class_body): next_node = None else: next_node = class_body[idx + 1] docstring_candidates = [] if isinstance(next_node, ast.Expr): # might be docstring docstring_candidates.append(_docstring_from_expr(next_node)) # maybe no luck with """ docstring? look for EOL comment. docstring_candidates.append(_docstring_from_eol_comment(func_source, node)) # check non-whitespace lines above for Sphinx-style comment. docstring_candidates.append(_docstring_from_sphinx_comment(func_source, node)) docstring_candidates_nn = list(filter(None, docstring_candidates)) if len(docstring_candidates_nn) > 1: # Multiple docstrings found, warn warnings.warn(MultipleDocstringsWarning(getattr(an_enum, targets[0]), docstring_candidates_nn)) if docstring_candidates_nn: docstring = docstring_candidates_nn[0] for target in targets: getattr(an_enum, target).__doc__ = docstring return an_enum def document_member(enum_member: Enum) -> None: """ Document a member of an enum by adding a comment to the end of the line that starts with ``doc:``. :param enum_member: A member of an :class:`~enum.Enum` subclass """ if not isinstance(enum_member, Enum): raise TypeError(f"'an_enum' must be an 'Enum', not {type(enum_member)}!") if not INTERACTIVE: return None func_source = dedent(inspect.getsource(enum_member.__class__)) in_docstring = False base_indent = None for line in func_source.split('\n'): indent, line = get_dedented_line(line) if line.startswith("class") or not line: continue all_tokens = get_tokens(line) base_indent = get_base_indent(base_indent, all_tokens, indent) # print(all_tokens) if enum_member.name not in line: continue if all_tokens[0][0] in pygments.token.Literal.String: if all_tokens[0][1] in {'"""', "'''"}: # TODO: handle the other quotes appearing in docstring in_docstring = not in_docstring if all_tokens[0][0] in pygments.token.Name and in_docstring: continue elif all_tokens[0][0] not in pygments.token.Name: continue else: if indent > base_indent: # type: ignore[operator] continue enum_vars, doc = parse_tokens(all_tokens) for var in enum_vars: # print(repr(var)) if not var.startswith('@'): if var == enum_member.name: enum_member.__doc__ = doc return None def parse_tokens(all_tokens: Iterable["pygments.Token"]) -> Tuple[List, Optional[str]]: """ Parse the tokens representing a line of code to identify Enum members and ``doc:`` comments. :param all_tokens: :return: A list of the Enum members' names, and the docstring for them. """ enum_vars = [] doc = None comment = '' for token in all_tokens: if token[0] in pygments.token.Name: enum_vars.append(token[1]) elif token[0] in pygments.token.Comment: comment = token[1] break for match in re.finditer(r"(doc:\s*)([^#]*)(#|$)", comment): if match.group(2): doc = match.group(2).rstrip() break return enum_vars, doc def get_base_indent( base_indent: Optional[int], all_tokens: Sequence[Sequence], indent: int, ) -> Optional[int]: """ Determine the base level of indentation (i.e. one level of indentation in from the ``c`` of ``class``). :param base_indent: The current base level of indentation :param all_tokens: :param indent: The current level of indentation :returns: The base level of indentation """ if not base_indent: if all_tokens[0][0] in pygments.token.Literal.String: if all_tokens[0][1] in {'"""', "'''"}: base_indent = indent elif all_tokens[0][0] in pygments.token.Keyword: base_indent = indent elif all_tokens[0][0] in pygments.token.Name: base_indent = indent return base_indent class DocumentedEnum(Enum): """ An enum where docstrings are automatically added to members from comments starting with ``doc:``. .. note:: This class does not (yet) support the other docstring formats :deco:`~.document_enum` does. """ def __init__(self, value): # noqa: MAN001 document_member(self) # super().__init__(value) def get_dedented_line(line: str) -> Tuple[int, str]: """ Returns the line without indentation, and the amount of indentation. :param line: A line of Python source code """ dedented_line = dedent(line) indent = len(line) - len(dedented_line) line = dedented_line.strip() return indent, line enum_tools-0.12.0/enum_tools/py.typed000066400000000000000000000000001460302440600176260ustar00rootroot00000000000000enum_tools-0.12.0/enum_tools/utils.py000066400000000000000000000052201460302440600176520ustar00rootroot00000000000000#!/usr/bin/env python3 # # utils.py """ General utility functions. """ # # Copyright (c) 2020-2021 Dominic Davis-Foster # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # stdlib import inspect from enum import Enum, EnumMeta, Flag from typing import Tuple, Type # 3rd party from typing_extensions import Protocol, runtime_checkable __all__ = ["HasMRO", "is_enum", "is_enum_member", "is_flag", "get_base_object"] @runtime_checkable class HasMRO(Protocol): """ :class:`typing.Protocol` for classes that have a method resolution order magic method (``__mro__``). """ @property def __mro__(self) -> Tuple[Type]: ... def is_enum(obj: Type) -> bool: """ Returns :py:obj:`True` if ``obj`` is an :class:`enum.Enum`. :param obj: """ # The enum itself is subclass of EnumMeta; enum members subclass Enum return isinstance(obj, EnumMeta) def is_enum_member(obj: Type) -> bool: """ Returns :py:obj:`True` if ``obj`` is an :class:`enum.Enum` member. :param obj: """ # The enum itself is subclass of EnumMeta; enum members subclass Enum return isinstance(obj, Enum) def is_flag(obj: Type) -> bool: """ Returns :py:obj:`True` if ``obj`` is an :class:`enum.Flag`. :param obj: """ # The enum itself is subclass of EnumMeta; enum members subclass Enum if is_enum(obj) and isinstance(obj, HasMRO): return Flag in inspect.getmro(obj) else: return False def get_base_object(enum: Type[HasMRO]) -> Type: """ Returns the object type of the enum's members. If the members are of indeterminate type then the :class:`object` class is returned. :param enum: :rtype: :raises TypeError: If ``enum`` is not an Enum. """ try: mro = inspect.getmro(enum) except AttributeError: raise TypeError("not an Enum") if Flag in mro: mro = mro[:mro.index(Flag)] elif Enum in mro: mro = mro[:mro.index(Enum)] else: raise TypeError("not an Enum") mro = mro[1:] for obj in mro: if not isinstance(obj, EnumMeta): return obj return object enum_tools-0.12.0/formate.toml000066400000000000000000000027601460302440600163140ustar00rootroot00000000000000[hooks] dynamic_quotes = 10 collections-import-rewrite = 20 reformat-generics = 40 noqa-reformat = 60 ellipsis-reformat = 70 squish_stubs = 80 [config] indent = "\t" line_length = 115 [hooks.yapf] priority = 30 [hooks.isort] priority = 50 [hooks.yapf.kwargs] yapf_style = ".style.yapf" [hooks.isort.kwargs] indent = "\t\t" multi_line_output = 8 import_heading_stdlib = "stdlib" import_heading_thirdparty = "3rd party" import_heading_firstparty = "this package" import_heading_localfolder = "this package" balanced_wrapping = false lines_between_types = 0 use_parentheses = true remove_redundant_aliases = true default_section = "THIRDPARTY" known_third_party = [ "aenum", "alabaster", "beautifulsoup4", "bs4", "coincidence", "coverage", "coverage_pyver_pragma", "domdf_python_tools", "extras_require", "github", "html5lib", "importlib_metadata", "pygments", "pytest", "pytest_cov", "pytest_randomly", "pytest_regressions", "pytest_rerunfailures", "pytest_timeout", "requests", "sphinx", "sphinx_autodoc_typehints", "sphinx_notfound_page", "sphinx_prompt", "sphinx_rtd_theme", "sphinx_tabs", "sphinx_toolbox", "sphinxcontrib_applehelp", "sphinxcontrib_devhelp", "sphinxcontrib_htmlhelp", "sphinxcontrib_httpdomain", "sphinxcontrib_jsmath", "sphinxcontrib_qthelp", "sphinxcontrib_serializinghtml", "sphinxemoji", "typing_extensions", ] known_first_party = [ "enum_tools",] enum_tools-0.12.0/justfile000066400000000000000000000005731460302440600155320ustar00rootroot00000000000000default: lint pdf-docs: latex-docs make -C doc-source/build/latex/ latex-docs: SPHINX_BUILDER=latex tox -e docs unused-imports: tox -e lint -- --select F401 incomplete-defs: tox -e lint -- --select MAN vdiff: git diff $(repo-helper show version -q)..HEAD bare-ignore: greppy '# type:? *ignore(?!\[|\w)' -s lint: unused-imports incomplete-defs bare-ignore tox -n qa enum_tools-0.12.0/pyproject.toml000066400000000000000000000105411460302440600166720ustar00rootroot00000000000000[build-system] requires = [ "whey",] build-backend = "whey" [project] name = "enum_tools" version = "0.12.0" description = "Tools to expand Python's enum module." readme = "README.rst" keywords = [ "documentation", "enum", "sphinx", "sphinx-extension",] dynamic = [ "requires-python", "classifiers", "dependencies",] [[project.authors]] name = "Dominic Davis-Foster" email = "dominic@davis-foster.co.uk" [project.license] file = "LICENSE" [project.urls] Homepage = "https://github.com/domdfcoding/enum_tools" "Issue Tracker" = "https://github.com/domdfcoding/enum_tools/issues" "Source Code" = "https://github.com/domdfcoding/enum_tools" Documentation = "https://enum-tools.readthedocs.io/en/latest" [project.optional-dependencies] sphinx = [ "sphinx>=3.4.0", "sphinx-jinja2-compat>=0.1.1", "sphinx-toolbox>=2.16.0",] all = [ "sphinx>=3.4.0", "sphinx-jinja2-compat>=0.1.1", "sphinx-toolbox>=2.16.0",] [tool.whey] base-classifiers = [ "Development Status :: 4 - Beta", "Framework :: Sphinx :: Extension", "Intended Audience :: Developers", "Programming Language :: Python", "Topic :: Documentation", "Topic :: Documentation :: Sphinx", "Topic :: Software Development :: Documentation", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities", "Typing :: Typed", ] python-versions = [ "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12",] python-implementations = [ "CPython", "PyPy",] platforms = [ "Windows", "macOS", "Linux",] license-key = "LGPL-3.0-or-later" additional-files = [ "recursive-include enum_tools/ requirements.txt", "recursive-exclude tests/ *",] [tool.mkrecipe] conda-channels = [ "conda-forge", "domdfcoding",] extras = "all" [tool.sphinx-pyproject] github_username = "domdfcoding" github_repository = "enum_tools" author = "Dominic Davis-Foster" project = "enum-tools" copyright = "2020-2022 Dominic Davis-Foster" language = "en" package_root = "enum_tools" extensions = [ "sphinx_toolbox", "sphinx_toolbox.more_autodoc", "sphinx_toolbox.more_autosummary", "sphinx_toolbox.documentation_summary", "sphinx_toolbox.tweaks.param_dash", "sphinxcontrib.toctree_plus", "sphinx_toolbox.tweaks.latex_layout", "sphinx_toolbox.tweaks.latex_toc", "sphinx.ext.intersphinx", "sphinx.ext.mathjax", "sphinxcontrib.extras_require", "sphinx.ext.todo", "sphinxemoji.sphinxemoji", "notfound.extension", "sphinx_copybutton", "sphinxcontrib.default_values", "sphinx_debuginfo", "sphinx_licenseinfo", "seed_intersphinx_mapping", "html_section", "enum_tools.autoenum", "sphinx_toolbox_experimental.needspace", "sphinx_toolbox_experimental.autosummary_widths", "sphinx_toolbox_experimental.succinct_seealso", "sphinx_toolbox_experimental.missing_xref", ] sphinxemoji_style = "twemoji" gitstamp_fmt = "%d %b %Y" templates_path = [ "_templates",] html_static_path = [ "_static",] source_suffix = ".rst" master_doc = "index" suppress_warnings = [ "image.nonlocal_uri",] pygments_style = "default" html_theme = "domdf_sphinx_theme" html_theme_path = [ "../..",] html_show_sourcelink = true toctree_plus_types = [ "class", "confval", "data", "directive", "enum", "exception", "flag", "function", "namedtuple", "protocol", "role", "typeddict", ] add_module_names = false hide_none_rtype = true all_typevars = true overloads_location = "bottom" html_codeblock_linenos_style = "table" autodoc_exclude_members = [ "__dict__", "__class__", "__dir__", "__weakref__", "__module__", "__annotations__", "__orig_bases__", "__parameters__", "__subclasshook__", "__init_subclass__", "__attrs_attrs__", "__init__", "__new__", "__getnewargs__", "__abstractmethods__", "__hash__", ] [tool.mypy] python_version = "3.8" namespace_packages = true check_untyped_defs = true warn_unused_ignores = true no_implicit_optional = true show_error_codes = true [tool.snippet-fmt] directives = [ "code-block",] [tool.dependency-dash."requirements.txt"] order = 10 [tool.dependency-dash."tests/requirements.txt"] order = 20 include = false [tool.dependency-dash."doc-source/requirements.txt"] order = 30 include = false [tool.snippet-fmt.languages.python] reformat = true [tool.snippet-fmt.languages.TOML] reformat = true [tool.snippet-fmt.languages.ini] [tool.snippet-fmt.languages.json] enum_tools-0.12.0/repo_helper.yml000066400000000000000000000062201460302440600170040ustar00rootroot00000000000000# Configuration for 'repo_helper' (https://github.com/domdfcoding/repo_helper) --- modname: enum_tools copyright_years: "2020-2022" author: "Dominic Davis-Foster" email: "dominic@davis-foster.co.uk" version: "0.12.0" username: "domdfcoding" license: 'LGPLv3+' short_desc: "Tools to expand Python's enum module." use_whey: true tox_testenv_extras: all standalone_contrib_guide: true min_coverage: 86 docs_fail_on_warning: true mypy_version: "0.931" on_conda_forge: true conda_channels: - conda-forge # Versions to run tests for python_versions: 3.6: matrix_exclude: sphinx: - 5.0 - 5.1 - 5.2 - 5.3 - 6.0 - 6.1 - 6.2 - 7.0 - 7.1 - 7.2 3.7: matrix_exclude: sphinx: - 6.0 - 6.1 - 6.2 - 7.0 - 7.1 - 7.2 3.8: matrix_exclude: sphinx: - 7.2 3.9: "3.10": "3.11": "3.12": 3.13-dev: matrix_exclude: sphinx: - 3.4 - 3.5 - 4.0 - 4.1 - 4.2 - 4.3 - 4.4 - 4.5 - 5.0 - 5.1 - 5.2 - 5.3 - 6.0 - 6.1 pypy36: matrix_exclude: sphinx: - 3.4 - 3.5 - 4.0 - 4.1 - 4.2 - 5.0 - 5.1 - 5.2 - 5.3 - 6.0 - 6.1 - 6.2 - 7.0 - 7.1 - 7.2 pypy37: matrix_exclude: sphinx: - 3.4 - 3.5 - 4.0 - 4.1 - 4.2 - 6.0 - 6.1 - 6.2 - 7.0 - 7.1 - 7.2 pypy38: matrix_exclude: sphinx: - 3.4 - 3.5 - 4.0 - 4.1 - 4.2 - 7.2 pypy39: matrix_exclude: sphinx: - 3.4 - 3.5 - 4.0 - 4.1 - 4.2 manifest_additional: - recursive-include enum_tools/ requirements.txt - recursive-exclude tests/ * classifiers: - 'Development Status :: 4 - Beta' - 'Intended Audience :: Developers' - 'Programming Language :: Python' - 'Topic :: Software Development :: Libraries :: Python Modules' - "Framework :: Sphinx :: Extension" - "Topic :: Documentation" - 'Topic :: Documentation :: Sphinx' - 'Topic :: Software Development :: Documentation' - "Topic :: Utilities" keywords: - enum - documentation - sphinx - sphinx-extension extras_require: sphinx: - sphinx>=3.4.0 - sphinx-toolbox>=2.16.0 - sphinx-jinja2-compat>=0.1.1 extra_sphinx_extensions: - enum_tools.autoenum - sphinx_toolbox_experimental.needspace - sphinx_toolbox_experimental.autosummary_widths - sphinx_toolbox_experimental.succinct_seealso - sphinx_toolbox_experimental.missing_xref sphinx_conf_epilogue: - html_logo = "../enum_tools.png" - autosummary_widths_builders = ["latex"] - nitpicky = True - needspace_amount = "1\\baselineskip" - ignore_missing_xrefs = ["^sphinx.ext.autodoc.(Class|Attribute)?Documenter$", "^enum.EnumMeta$", "^docutils.nodes.Element$", "^sphinx.domains"] - from typing import Type - import enum_tools.autoenum - from sphinx.ext.autodoc.directive import DocumenterBridge - enum_tools.autoenum.DocumenterBridge = DocumenterBridge - enum_tools.autoenum.Type = Type preserve_custom_theme: true third_party_version_matrix: sphinx: - 3.4 - 3.5 - 4.0 - 4.1 - 4.2 - 4.3 - 4.4 - 4.5 - 5.0 - 5.1 - 5.2 - 5.3 - 6.0 - 6.1 - 6.2 - 7.0 - 7.1 - 7.2 # - latest enum_tools-0.12.0/requirements.txt000066400000000000000000000000531460302440600172370ustar00rootroot00000000000000pygments>=2.6.1 typing-extensions>=3.7.4.3 enum_tools-0.12.0/stubs.txt000066400000000000000000000000761460302440600156610ustar00rootroot00000000000000git+https://github.com/domdfcoding/docutils-stubs@docutils-16 enum_tools-0.12.0/tests/000077500000000000000000000000001460302440600151175ustar00rootroot00000000000000enum_tools-0.12.0/tests/__init__.py000066400000000000000000000000001460302440600172160ustar00rootroot00000000000000enum_tools-0.12.0/tests/conftest.py000066400000000000000000000020421460302440600173140ustar00rootroot00000000000000# stdlib import pathlib import sys import types from typing import Iterator # 3rd party import pytest import sphinx from bs4 import BeautifulSoup # type: ignore[import] from sphinx.application import Sphinx if sys.version_info >= (3, 10): types.Union = types.UnionType if sphinx.version_info >= (7, 2): path = pathlib.Path else: # 3rd party from sphinx.testing.path import path # type: ignore[misc] pytest_plugins = ("coincidence", "sphinx.testing.fixtures", "sphinx_toolbox.testing") @pytest.fixture(scope="session") def rootdir() -> path: rdir = pathlib.Path(__file__).parent.absolute() / "doc-test" if not (rdir / "test-root").is_dir(): (rdir / "test-root").mkdir(parents=True) return path(rdir) @pytest.fixture() def content(app: Sphinx) -> Iterator[Sphinx]: app.build() yield app @pytest.fixture() def page(content, request) -> BeautifulSoup: # noqa: MAN001 pagename = request.param c = (content.outdir / pagename).read_text() c = c.replace("¢", 'ΒΆ') c = c.replace("Ò€ℒ", '’') yield BeautifulSoup(c, "html5lib") enum_tools-0.12.0/tests/doc-test/000077500000000000000000000000001460302440600166415ustar00rootroot00000000000000enum_tools-0.12.0/tests/doc-test/test-root/000077500000000000000000000000001460302440600206015ustar00rootroot00000000000000enum_tools-0.12.0/tests/doc-test/test-root/conf.py000066400000000000000000000001041460302440600220730ustar00rootroot00000000000000extensions = [ "sphinx.ext.autodoc", "enum_tools.autoenum", ] enum_tools-0.12.0/tests/doc-test/test-root/flag.rst000066400000000000000000000003231460302440600222420ustar00rootroot00000000000000===================== autoenum Demo - Flag ===================== .. autoflag:: enum_tools.demo.StatusFlags :members: .. automodule:: enum_tools.demo :members: :exclude-members: People,NoMethods,NoMemberDoc enum_tools-0.12.0/tests/doc-test/test-root/index.rst000066400000000000000000000004421460302440600224420ustar00rootroot00000000000000================== autoenum Demo ================== .. automodule:: enum_tools.demo :members: :exclude-members: NoMethods,NoMemberDoc,StatusFlags .. autoenum:: enum_tools.demo.NoMethods :members: :py:enum:`enum_tools.demo.People` :py:enum:`~.People` :enum:`~enum_tools.demo.People` enum_tools-0.12.0/tests/doc-test/test-root/no-member-doc.rst000066400000000000000000000003611460302440600237570ustar00rootroot00000000000000============================================== autoenum Demo - Members without docstrings ============================================== .. autoenum:: enum_tools.demo.NoMemberDoc :members: :py:enum:mem:`enum_tools.demo.NoMemberDoc.Alice` enum_tools-0.12.0/tests/requirements.txt000066400000000000000000000010701460302440600204010ustar00rootroot00000000000000alabaster<=0.7.13 beautifulsoup4<4.12.1,>=4.9.1 coincidence>=0.2.0 coverage>=5.1 coverage-pyver-pragma>=0.2.1 domdf-python-tools[testing]>=2.0.1 html5lib>=1.1 importlib-metadata>=3.6.0 iniconfig!=1.1.0,>=1.0.1 pytest>=6.0.0 pytest-cov>=2.8.1 pytest-randomly>=3.7.0 pytest-regressions>=2.0.1 pytest-rerunfailures>=9.0 pytest-timeout>=1.4.2 sphinx>=3.2.1 sphinx-toolbox[testing]>=2.16.0 sphinxcontrib-applehelp<=1.0.4 sphinxcontrib-devhelp<=1.0.2 sphinxcontrib-htmlhelp<=2.0.1 sphinxcontrib-jsmath<=1.0.1 sphinxcontrib-qthelp<=1.0.3 sphinxcontrib-serializinghtml<=1.1.5 enum_tools-0.12.0/tests/test_autoenum.py000066400000000000000000000243221460302440600203700ustar00rootroot00000000000000# Based on https://github.com/pauleveritt/customizing_sphinx/tree/master/tests/integration # and https://github.com/sphinx-doc/sphinx/issues/7008 # stdlib import sys from decimal import Decimal from enum import Enum from pathlib import Path # 3rd party import pytest import sphinx from bs4 import BeautifulSoup, NavigableString # type: ignore[import] from sphinx.application import Sphinx from sphinx_toolbox.testing import HTMLRegressionFixture # this package from enum_tools.autoenum import EnumDocumenter NEW_ENUM_REPR = sys.version_info >= (3, 13) xfail_312 = pytest.mark.xfail( reason="Python 3.12 behaviour has not been finalised yet.", condition=sys.version_info[:2] == (3, 13) and sys.version_info.releaselevel == "alpha" ) @pytest.mark.parametrize("obj", [ "abcdefg", b"abcdefg", b"\x00\x01", 12345, 123.45, Decimal(123.45), Path('.'), ]) def test_cannot_document_member(obj: object): assert not EnumDocumenter.can_document_member(obj, '', True, '') class MyEnum(Enum): foo = 1 bar = 2 def test_can_document_member(): assert EnumDocumenter.can_document_member(MyEnum, '', True, '') def test(app: Sphinx) -> None: # app is a Sphinx application object for default sphinx project (`tests/roots/test-root`). app.build() # @pytest.mark.sphinx(buildername='latex') # def test_latex(app): # # latex builder is chosen here. # app.build() # pytestmark = pytest.mark.sphinx('html', testroot='root') return_arrow = " β†’ " def preprocess_soup(soup: BeautifulSoup) -> None: if sphinx.version_info >= (3, 5): # pragma: no cover for em in soup.select("em.property"): child = ''.join(c.string for c in em.contents) for c in em.children: c.extract() em.contents = [] em.insert(0, child) for dl in soup.select("dl.py.method dt"): # .sig.sig-object.py if return_arrow in dl.contents: arrow_idx = dl.contents.index(return_arrow) dl.contents[arrow_idx] = NavigableString( dl.contents[arrow_idx] + dl.contents[arrow_idx + 1].contents[0] ) dl.contents[arrow_idx + 1].extract() for dt in soup.select("span.pre"): dt.replace_with_children() for dt in soup.select("span.sig-return"): dt.replace_with(NavigableString(dt.get_text())) for div in soup.findAll("script"): if div.get("src"): div["src"] = div["src"].split("?v=")[0] print(div["src"]) @xfail_312 @pytest.mark.parametrize( "page", [ "index.html", ], indirect=True ) def test_index(page: BeautifulSoup, html_regression: HTMLRegressionFixture): # Make sure the page title is what you expect title = page.find("h1").contents[0].strip() assert "autoenum Demo" == title preprocess_soup(page) html_regression.check(page, jinja2=True) # Now test the directive class_count = 0 for class_ in page.findAll("dl"): if "enum" not in class_["class"]: continue if class_count == 0: assert class_.find("dt")["id"] == "enum_tools.demo.People" assert class_.find("dd").findAll('p')[0].contents[0] == "An enumeration of people." elif class_count == 1: assert class_.find("dt")["id"] == "enum_tools.demo.NoMethods" assert class_.find("dd").findAll('p')[0].contents[0] == "An enumeration of people without any methods." tag = 'int' assert str(class_.find("dd").findAll('p')[1].contents[0]) == tag assert class_.find("dd").findAll('p')[2].contents[0] == "Valid values are as follows:" attr_count = 0 for attr in class_.findAll("dl"): if "attribute" not in attr["class"]: continue if class_count == 0: class_name = "People" else: class_name = "NoMethods" if attr_count == 0: assert attr.find("dt")["id"] == f"enum_tools.demo.{class_name}.Bob" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == f" = {class_name}.Bob" else: assert attr.find("dt").em.contents[0] == f" = <{class_name}.Bob: 1>" assert str(attr.find("dd").contents[0]) == "

A person called Bob

" elif attr_count == 1: assert attr.find("dt")["id"] == f"enum_tools.demo.{class_name}.Alice" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == f" = {class_name}.Alice" else: assert attr.find("dt").em.contents[0] == f" = <{class_name}.Alice: 2>" assert str(attr.find("dd").contents[0]) == "

A person called Alice

" elif attr_count == 2: assert attr.find("dt")["id"] == f"enum_tools.demo.{class_name}.Carol" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == f" = {class_name}.Carol" else: assert attr.find("dt").em.contents[0] == f" = <{class_name}.Carol: 3>" if class_count == 0: assert str(attr.find("dd").contents[0]) == "

A person called Carol.

" assert str(attr.find("dd").contents[1]) == '\n' assert str(attr.find("dd").contents[2]) == "

This is a multiline docstring.

" else: assert str(attr.find("dd").contents[0]) == "

A person called Carol

" elif attr_count == 3: assert attr.find("dt")["id"] == f"enum_tools.demo.{class_name}.Dennis" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == f" = {class_name}.Dennis" else: assert attr.find("dt").em.contents[0] == f" = <{class_name}.Dennis: 4>" assert str(attr.find("dd").contents[0]) == "

A person called Dennis

" attr_count += 1 class_count += 1 # print(page) assert class_count == 2 @xfail_312 @pytest.mark.parametrize( "page", [ "flag.html", ], indirect=True ) def test_flag(page: BeautifulSoup, html_regression: HTMLRegressionFixture): # Make sure the page title is what you expect title = page.find("h1").contents[0].strip() assert "autoenum Demo - Flag" == title preprocess_soup(page) html_regression.check(page, jinja2=True) # Now test the directive class_count = 0 for class_ in page.findAll("dl"): if "flag" not in class_["class"]: continue if class_count == 0: assert class_.find("dt")["id"] == "enum_tools.demo.StatusFlags" elif class_count == 1: assert class_.find("dt")["id"] == "id0" assert class_.find("dd").findAll('p')[0].contents[0] == "An enumeration of status codes." tag = 'int' assert str(class_.find("dd").findAll('p')[1].contents[0]) == tag assert class_.find("dd").findAll('p')[2].contents[0] == "Valid values are as follows:" attr_count = 0 for attr in class_.findAll("dl"): if "attribute" not in attr["class"]: continue if attr_count == 0: if class_count == 0: assert attr.find("dt")["id"] == "enum_tools.demo.StatusFlags.Running" elif class_count == 1: assert attr.find("dt")["id"] == "id1" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == " = StatusFlags.Running" else: assert attr.find("dt").em.contents[0] == " = " assert str(attr.find("dd").contents[0]) == "

The system is running.

" elif attr_count == 1: if class_count == 0: assert attr.find("dt")["id"] == "enum_tools.demo.StatusFlags.Stopped" elif class_count == 1: assert attr.find("dt")["id"] == "id2" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == " = StatusFlags.Stopped" else: assert attr.find("dt").em.contents[0] == " = " assert str(attr.find("dd").contents[0]) == "

The system has stopped.

" elif attr_count == 2: if class_count == 0: assert attr.find("dt")["id"] == "enum_tools.demo.StatusFlags.Error" elif class_count == 1: assert attr.find("dt")["id"] == "id3" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == " = StatusFlags.Error" else: assert attr.find("dt").em.contents[0] == " = " assert str(attr.find("dd").contents[0]) == "

An error has occurred.

" attr_count += 1 class_count += 1 # print(page) assert class_count == 2 @xfail_312 @pytest.mark.parametrize( "page", [ "no-member-doc.html", ], indirect=True ) def test_no_member_doc(page: BeautifulSoup, html_regression: HTMLRegressionFixture): # Make sure the page title is what you expect title = page.find("h1").contents[0].strip() assert "autoenum Demo - Members without docstrings" == title preprocess_soup(page) html_regression.check(page, jinja2=True) # Now test the directive class_count = 0 for class_ in page.findAll("dl"): if "enum" not in class_["class"]: continue assert class_.find("dt")["id"] == "enum_tools.demo.NoMemberDoc" assert class_.find("dd").findAll('p')[0].contents[ 0] == "An enumeration of people without any member docstrings." if class_count == 0: tag = 'int' assert str(class_.find("dd").findAll('p')[1].contents[0]) == tag assert class_.find("dd").findAll('p')[2].contents[0] == "Valid values are as follows:" else: assert class_.find("dd").findAll('p')[1].contents[0] == "Valid values are as follows:" attr_count = 0 for attr in class_.findAll("dl"): if "attribute" not in attr["class"]: continue if attr_count == 0: if class_count == 0: assert attr.find("dt")["id"] == "enum_tools.demo.NoMemberDoc.Bob" elif class_count == 1: assert attr.find("dt")["id"] == "id1" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == " = NoMemberDoc.Bob" else: assert attr.find("dt").em.contents[0] == " = " assert not attr.find("dd").contents elif attr_count == 1: if class_count == 0: assert attr.find("dt")["id"] == "enum_tools.demo.NoMemberDoc.Alice" elif class_count == 1: assert attr.find("dt")["id"] == "id2" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == " = NoMemberDoc.Alice" else: assert attr.find("dt").em.contents[0] == " = " assert not attr.find("dd").contents elif attr_count == 2: if class_count == 0: assert attr.find("dt")["id"] == "enum_tools.demo.NoMemberDoc.Carol" elif class_count == 1: assert attr.find("dt")["id"] == "id3" if NEW_ENUM_REPR: assert attr.find("dt").em.contents[0] == " = NoMemberDoc.Carol" else: assert attr.find("dt").em.contents[0] == " = " assert not attr.find("dd").contents attr_count += 1 class_count += 1 # print(page) assert class_count == 1 enum_tools-0.12.0/tests/test_autoenum_/000077500000000000000000000000001460302440600201525ustar00rootroot00000000000000enum_tools-0.12.0/tests/test_autoenum_/test_flag_flag_html_.html000066400000000000000000000252451460302440600251740ustar00rootroot00000000000000{% set heading = ("heading" if sphinx_version >= (5, 0) else 'headline') -%} {% set sig_prename_tag = ("span" if sphinx_version >= (4, 0) else 'code') -%} {% set sig_object_class = (' class="sig sig-object py"' if sphinx_version >= (4, 0) else '') -%} {% set permalink = ('Link' if sphinx_version >= (7, 2) else 'Permalink') -%} {% set NEW_ENUM_REPR = python_version >= (3, 13) -%} = (7, 2) %} data-content_root="./"{% endif %}{% if sphinx_version >= (5, 0) %} lang="en"{% endif %}> {% if docutils_version[1] == 18 %} {% elif docutils_version[1] == 17 %} {% elif docutils_version[1] == 19 %} {% elif docutils_version[1] == 20 %} {% endif %} autoenum Demo - Flag β€” Python documentation {% if sphinx_version < (6, 0) %} {% if sphinx_version >= (5, 0) %} {% endif %}{% endif %} {% if sphinx_version >= (5, 2) %} {% endif %}
<{% if docutils_version >= (0, 17) %}section{% else %}div class="section"{% endif %} id="autoenum-demo-flag">

autoenum Demo - Flag ΒΆ

flag <{{ sig_prename_tag }} class="sig-prename descclassname"> enum_tools.demo. <{{ sig_prename_tag }} class="sig-name descname"> StatusFlags ( value ) ΒΆ

An enumeration of status codes.

Member Type{% if docutils_version >= (0, 18) %} : {% endif %}

int

Valid values are as follows:

<{{ sig_prename_tag }} class="sig-name descname"> Running = {% if NEW_ENUM_REPR %}StatusFlags.Running{% else %}<StatusFlags.Running: 1>{% endif %} ΒΆ

The system is running.

<{{ sig_prename_tag }} class="sig-name descname"> Stopped = {% if NEW_ENUM_REPR %}StatusFlags.Stopped{% else %}<StatusFlags.Stopped: 2>{% endif %} ΒΆ

The system has stopped.

<{{ sig_prename_tag }} class="sig-name descname"> Error = {% if NEW_ENUM_REPR %}StatusFlags.Error{% else %}<StatusFlags.Error: 4>{% endif %} ΒΆ

An error has occurred.

The Flag and its members also have the following methods:

<{{ sig_prename_tag }} class="sig-name descname"> has_errored ( ) β†’ bool ΒΆ

Returns whether the operation has errored.

{% if sphinx_version < (7, 2) %} {% endif %}
= (7, 2) %} id="module-enum_tools.demo"{% endif %}> flag <{{ sig_prename_tag }} class="sig-prename descclassname"> enum_tools.demo. <{{ sig_prename_tag }} class="sig-name descname"> StatusFlags ( value ) ΒΆ

An enumeration of status codes.

Member Type{% if docutils_version >= (0, 18) %} : {% endif %}

int

Valid values are as follows:

<{{ sig_prename_tag }} class="sig-name descname"> Running = {% if NEW_ENUM_REPR %}StatusFlags.Running{% else %}<StatusFlags.Running: 1>{% endif %} ΒΆ

The system is running.

<{{ sig_prename_tag }} class="sig-name descname"> Stopped = {% if NEW_ENUM_REPR %}StatusFlags.Stopped{% else %}<StatusFlags.Stopped: 2>{% endif %} ΒΆ

The system has stopped.

<{{ sig_prename_tag }} class="sig-name descname"> Error = {% if NEW_ENUM_REPR %}StatusFlags.Error{% else %}<StatusFlags.Error: 4>{% endif %} ΒΆ

An error has occurred.

The Flag and its members also have the following methods:

<{{ sig_prename_tag }} class="sig-name descname"> has_errored ( ) β†’ bool ΒΆ

Returns whether the operation has errored.

= (0, 17) %}section{% else %}div{% endif %}>
enum_tools-0.12.0/tests/test_autoenum_/test_index_index_html_.html000066400000000000000000000302201460302440600255550ustar00rootroot00000000000000{% set heading = ("heading" if sphinx_version >= (5, 0) else 'headline') -%} {% set sig_prename_tag = ("span" if sphinx_version >= (4, 0) else 'code') -%} {% set sig_object_class = (' class="sig sig-object py"' if sphinx_version >= (4, 0) else '') -%} {% set permalink = ('Link' if sphinx_version >= (7, 2) else 'Permalink') -%} {% set NEW_ENUM_REPR = python_version >= (3, 13) -%} {% set anchor = "autoenum-demo" if sphinx_version >= (7,2) else "module-enum_tools.demo" -%} = (7, 2) %} data-content_root="./"{% endif %}{% if sphinx_version >= (5, 0) %} lang="en"{% endif %}> {% if docutils_version[1] == 18 %} {% elif docutils_version[1] == 17 %} {% elif docutils_version[1] == 19 %} {% elif docutils_version[1] == 20 %} {% endif %} autoenum Demo β€” Python documentation {% if sphinx_version < (6, 0) %} {% if sphinx_version >= (5, 0) %} {% endif %}{% endif %} {% if sphinx_version >= (5, 2) %} {% endif %}
<{% if docutils_version >= (0, 17) %}section{% else %}div class="section"{% endif %} id="{{ anchor }}">{% if sphinx_version < (7,2) %} {% endif %}

autoenum Demo ΒΆ

= (7, 2) %} id="module-enum_tools.demo"{% endif %}> enum <{{ sig_prename_tag }} class="sig-prename descclassname"> enum_tools.demo. <{{ sig_prename_tag }} class="sig-name descname"> People ( value ) ΒΆ

An enumeration of people.

Member Type{% if docutils_version >= (0, 18) %} : {% endif %}

int

Valid values are as follows:

<{{ sig_prename_tag }} class="sig-name descname"> Bob = {% if NEW_ENUM_REPR %}People.Bob{% else %}<People.Bob: 1>{% endif %} ΒΆ

A person called Bob

<{{ sig_prename_tag }} class="sig-name descname"> Alice = {% if NEW_ENUM_REPR %}People.Alice{% else %}<People.Alice: 2>{% endif %} ΒΆ

A person called Alice

<{{ sig_prename_tag }} class="sig-name descname"> Carol = {% if NEW_ENUM_REPR %}People.Carol{% else %}<People.Carol: 3>{% endif %} ΒΆ

A person called Carol.

This is a multiline docstring.

<{{ sig_prename_tag }} class="sig-name descname"> Dennis = {% if NEW_ENUM_REPR %}People.Dennis{% else %}<People.Dennis: 4>{% endif %} ΒΆ

A person called Dennis

The Enum and its members also have the following methods:

classmethod <{{ sig_prename_tag }} class="sig-name descname"> iter_values ( ) ΒΆ

Iterate over the values of the Enum.

classmethod <{{ sig_prename_tag }} class="sig-name descname"> as_list ( ) β†’ List ΒΆ

Return the Enum’s members as a list.

enum <{{ sig_prename_tag }} class="sig-prename descclassname"> enum_tools.demo. <{{ sig_prename_tag }} class="sig-name descname"> NoMethods ( value ) ΒΆ

An enumeration of people without any methods.

Member Type{% if docutils_version >= (0, 18) %} : {% endif %}

int

Valid values are as follows:

<{{ sig_prename_tag }} class="sig-name descname"> Bob = {% if NEW_ENUM_REPR %}NoMethods.Bob{% else %}<NoMethods.Bob: 1>{% endif %} ΒΆ

A person called Bob

<{{ sig_prename_tag }} class="sig-name descname"> Alice = {% if NEW_ENUM_REPR %}NoMethods.Alice{% else %}<NoMethods.Alice: 2>{% endif %} ΒΆ

A person called Alice

<{{ sig_prename_tag }} class="sig-name descname"> Carol = {% if NEW_ENUM_REPR %}NoMethods.Carol{% else %}<NoMethods.Carol: 3>{% endif %} ΒΆ

A person called Carol

enum_tools.demo.People

People

People

= (0, 17) %}section{% else %}div{% endif %}>
enum_tools-0.12.0/tests/test_autoenum_/test_no_member_doc_no_member_doc_html_.html000066400000000000000000000136051460302440600307270ustar00rootroot00000000000000{% set heading = ("heading" if sphinx_version >= (5, 0) else 'headline') -%} {% set sig_prename_tag = ("span" if sphinx_version >= (4, 0) else 'code') -%} {% set sig_object_class = (' class="sig sig-object py"' if sphinx_version >= (4, 0) else '') -%} {% set permalink = ('Link' if sphinx_version >= (7, 2) else 'Permalink') -%} {% set NEW_ENUM_REPR = python_version >= (3, 13) -%} = (7, 2) %} data-content_root="./"{% endif %}{% if sphinx_version >= (5, 0) %} lang="en"{% endif %}> {% if docutils_version[1] == 18 %} {% elif docutils_version[1] == 17 %} {% elif docutils_version[1] == 19 %} {% elif docutils_version[1] == 20 %} {% endif %} autoenum Demo - Members without docstrings β€” Python documentation {% if sphinx_version < (6, 0) %} {% if sphinx_version >= (5, 0) %} {% endif %}{% endif %} {% if sphinx_version >= (5, 2) %} {% endif %}
<{% if docutils_version >= (0, 17) %}section{% else %}div class="section"{% endif %} id="autoenum-demo-members-without-docstrings">

autoenum Demo - Members without docstrings ΒΆ

enum <{{ sig_prename_tag }} class="sig-prename descclassname"> enum_tools.demo. <{{ sig_prename_tag }} class="sig-name descname"> NoMemberDoc ( value ) ΒΆ

An enumeration of people without any member docstrings.

Member Type{% if docutils_version >= (0, 18) %} : {% endif %}

int

Valid values are as follows:

<{{ sig_prename_tag }} class="sig-name descname"> Bob = {% if NEW_ENUM_REPR %}NoMemberDoc.Bob{% else %}<NoMemberDoc.Bob: 1>{% endif %} ΒΆ
<{{ sig_prename_tag }} class="sig-name descname"> Alice = {% if NEW_ENUM_REPR %}NoMemberDoc.Alice{% else %}<NoMemberDoc.Alice: 2>{% endif %} ΒΆ
<{{ sig_prename_tag }} class="sig-name descname"> Carol = {% if NEW_ENUM_REPR %}NoMemberDoc.Carol{% else %}<NoMemberDoc.Carol: 3>{% endif %} ΒΆ

enum_tools.demo.NoMemberDoc.Alice

= (0, 17) %}section{% else %}div{% endif %}>
enum_tools-0.12.0/tests/test_documented_enum.py000066400000000000000000000151571460302440600217140ustar00rootroot00000000000000# stdlib import math import sys import warnings from decimal import Decimal from enum import Enum from pathlib import Path # 3rd party import pytest # this package import enum_tools.documentation from enum_tools.documentation import DocumentedEnum, MultipleDocstringsWarning, document_enum enum_tools.documentation.INTERACTIVE = True NEW_ENUM_REPR = sys.version_info >= (3, 13) xfail_313 = pytest.mark.xfail( reason="Python 3.13 behaviour has not been finalised yet.", condition=sys.version_info[:2] == (3, 13) and sys.version_info.releaselevel == "alpha" ) @document_enum class People(int, Enum): """ An enumeration of people """ Bob = bob = 1 # noqa # doc: A person called Bob # doc: another doc # isort: ignore Alice = 2 # doc: A person called Alice Carol = 3 """ A person called Carol. This is a multiline docstring. """ @classmethod def iter_values(cls): # noqa: MAN002 return iter(cls) #: A person called Dennis Dennis = 4 # This is a dummy function to test mypy def get_name(person: People = People.Bob) -> str: if person is People.Bob: return "Bob" elif person is People.Alice: return "Alice" elif person is People.Carol: return "Carol" return "Unknown" @xfail_313 def test_people(): assert People.Bob == 1 assert isinstance(People.Bob, People) assert isinstance(People.Bob, int) assert repr(People.Bob) == "People.Bob" if NEW_ENUM_REPR else "" assert People.Bob.__doc__ == "A person called Bob" assert People.Alice == 2 assert isinstance(People.Alice, People) assert isinstance(People.Alice, int) assert repr(People.Alice) == "People.Alice" if NEW_ENUM_REPR else "" assert People.Alice.__doc__ == "A person called Alice" assert People.Carol == 3 assert isinstance(People.Carol, People) assert isinstance(People.Carol, int) assert repr(People.Carol) == "People.Carol" if NEW_ENUM_REPR else "" assert People.Carol.__doc__ == "A person called Carol.\n\nThis is a multiline docstring." assert People.Dennis == 4 assert isinstance(People.Dennis, People) assert isinstance(People.Dennis, int) assert repr(People.Dennis) == "People.Dennis" if NEW_ENUM_REPR else "" assert People.Dennis.__doc__ == "A person called Dennis" assert list(iter(People)) == [People.Bob, People.Alice, People.Carol, People.Dennis] assert list(iter(People)) == [1, 2, 3, 4] assert list(People.iter_values()) == [People.Bob, People.Alice, People.Carol, People.Dennis] assert list(People.iter_values()) == [1, 2, 3, 4] class MyEnum(str, DocumentedEnum): a_value = b_value = "a value" # doc: Docstring def test_documented_enum(): assert MyEnum.a_value == "a value" assert MyEnum.a_value.__doc__ == "Docstring" @pytest.mark.parametrize( "obj", [ pytest.param("abcdefg", id="string"), pytest.param(b"abcdefg", id="bytes"), b"\x00\x01", 12345, 123.45, Decimal(123.45), Path('.'), print, math.ceil, Path, Decimal, str, float, ] ) def test_document_enum_wrong_types(obj: object): with pytest.raises(TypeError, match="'an_enum' must be an 'Enum', not .*!"): document_enum(obj) # type: ignore[type-var] @pytest.mark.parametrize( "obj", [ pytest.param("abcdefg", id="string"), pytest.param(b"abcdefg", id="bytes"), b"\x00\x01", 12345, 123.45, Decimal(123.45), Path('.'), print, math.ceil, Path, Decimal, str, float, ] ) def test_document_member_wrong_types(obj: object): with pytest.raises(TypeError, match="'an_enum' must be an 'Enum', not .*!"): enum_tools.document_member(obj) # type: ignore[arg-type] @xfail_313 def test_document_enum_not_interactive(): interactive_last_value = enum_tools.documentation.INTERACTIVE enum_tools.documentation.INTERACTIVE = False @document_enum class People(int, Enum): """ An enumeration of people """ Bob = bob = 1 # noqa # doc: A person called Bob # doc: another doc # isort: ignore Alice = 2 # doc: A person called Alice Carol = 3 # doc: A person called Carol @classmethod def iter_values(cls): # noqa: MAN002 return iter(cls) assert People.Bob == 1 assert isinstance(People.Bob, People) assert isinstance(People.Bob, int) assert repr(People.Bob) == "People.Bob" if NEW_ENUM_REPR else "" assert People.Bob.__doc__ == "\n\t\tAn enumeration of people\n\t\t" # The default assert People.Alice == 2 assert isinstance(People.Alice, People) assert isinstance(People.Alice, int) assert repr(People.Alice) == "People.Alice" if NEW_ENUM_REPR else "" assert People.Alice.__doc__ == "\n\t\tAn enumeration of people\n\t\t" # The default assert People.Carol == 3 assert isinstance(People.Carol, People) assert isinstance(People.Carol, int) assert repr(People.Carol) == "People.Carol" if NEW_ENUM_REPR else "" assert People.Carol.__doc__ == "\n\t\tAn enumeration of people\n\t\t" # The default assert list(iter(People)) == [People.Bob, People.Alice, People.Carol] assert list(iter(People)) == [1, 2, 3] assert list(People.iter_values()) == [People.Bob, People.Alice, People.Carol] assert list(People.iter_values()) == [1, 2, 3] enum_tools.documentation.INTERACTIVE = interactive_last_value @xfail_313 # yapf: disable def test_multiple_docstring_warning(): with pytest.warns(UserWarning) as record: @document_enum class ModeOfTransport(Enum): feeder = "feeder" # doc: A feeder vessel is a rather small vessel sent by a ship operator and moves in the region """A deep sea vessel is a rather large vessel sent by a ship operator and moves between distant regions, e.g. continents.""" deep_sea_vessel = "deep_sea_vessel" # yapf: enable assert len(record) == 1 warningmsg: warnings.WarningMessage = record[0] assert isinstance(warningmsg.message, MultipleDocstringsWarning) assert warningmsg.message.member is ModeOfTransport.feeder assert warningmsg.message.docstrings == [ "A deep sea vessel is a rather large vessel sent by a ship operator and moves between distant regions, " "e.g.\ncontinents.", "A feeder vessel is a rather small vessel sent by a ship operator and moves in the region", ] # Strictly this is indeterminate and the order shouldn't be relied on; # it's an implementation detail that the priority is what it is assert ModeOfTransport.feeder.__doc__ == ( "A deep sea vessel is a rather large vessel sent by a ship operator and moves between distant regions, " "e.g.\ncontinents." ) if sys.version_info >= (3, 11): # 3.11 changed this to None instead of a placeholder assert ModeOfTransport.deep_sea_vessel.__doc__ is None else: assert ModeOfTransport.deep_sea_vessel.__doc__ == "An enumeration." enum_tools-0.12.0/tests/test_enums.py000066400000000000000000000124471460302440600176670ustar00rootroot00000000000000""" test_enums ~~~~~~~~~~~~~~~ """ # stdlib import sys from enum import Enum # 3rd party import pytest # this package from enum_tools import IntEnum, StrEnum from enum_tools.custom_enums import AutoNumberEnum, IterableFlag, IterableIntFlag, MemberDirEnum, OrderedEnum NEW_ENUM_REPR = sys.version_info >= (3, 13) xfail_313 = pytest.mark.xfail( reason="Python 3.12 behaviour has not been finalised yet.", condition=sys.version_info[:2] == (3, 13) and sys.version_info.releaselevel == "alpha" ) class DramatisPersonae(StrEnum): Message = "a secret message" Bob = "The sender" Alice = "The recipient" Chuck = "A man of malicious intent" Craig = "A password cracker" Eve = "An eavesdropper" @xfail_313 def test_str_enum(): assert DramatisPersonae.Message == "a secret message" assert DramatisPersonae.Alice != "An eavesdropper" assert str(DramatisPersonae.Craig) == "A password cracker" assert DramatisPersonae("The sender") == DramatisPersonae.Bob == "The sender" if NEW_ENUM_REPR: assert repr(DramatisPersonae.Bob) == "DramatisPersonae.Bob" else: assert repr(DramatisPersonae.Bob) == "" class Numbers(IntEnum): One = 1 Two = 2 Three = 3 Four = 4 Five = 5 def test_int_enum(): assert Numbers.One == 1 assert Numbers.Two != 3 assert int(Numbers.Four) == 4 assert Numbers(5) == Numbers.Five == 5 assert isinstance(Numbers(5), int) # The following from https://github.com/python/cpython/pull/22221/files # PSF Licsense 2.0 def test_member_iter_int_flag(): class Color(IterableIntFlag): BLACK = 0 RED = 1 GREEN = 2 BLUE = 4 PURPLE = RED | BLUE assert list(Color.PURPLE) == [Color.BLUE, Color.RED] assert list(Color.BLUE) == [Color.BLUE] assert list(Color.GREEN) == [Color.GREEN] def test_member_iter_flag(): class Color(IterableFlag): BLACK = 0 RED = 1 GREEN = 2 BLUE = 4 PURPLE = RED | BLUE assert list(Color.PURPLE) == [Color.BLUE, Color.RED] assert list(Color.BLUE) == [Color.BLUE] assert list(Color.GREEN) == [Color.GREEN] def test_strenum(): # From https://github.com/python/cpython/pull/22337 # PSF License class GoodStrEnum(StrEnum): one = '1' two = '2' three = b'3', "ascii" four = b'4', "latin1", "strict" with pytest.raises(TypeError, match="1 is not a string"): class FirstFailedStrEnum(StrEnum): one = 1 two = '2' with pytest.raises(TypeError, match="2 is not a string"): class SecondFailedStrEnum(StrEnum): one = '1' two = 2, three = '3' with pytest.raises(TypeError, match="2 is not a string"): class ThirdFailedStrEnum(StrEnum): one = '1' two = 2 with pytest.raises(TypeError, match=f"encoding must be a string, not {sys.getdefaultencoding!r}"): class FourthFailedStrEnum(StrEnum): one = '1' two = b'2', sys.getdefaultencoding with pytest.raises(TypeError, match="errors must be a string, not 9"): class FifthFailedStrEnum(StrEnum): one = '1' two = b'2', "ascii", 9 @xfail_313 def test_member_dir_enum(): class MyEnum(int, MemberDirEnum): apple = 1 orange = 2 if sys.version_info < (3, 11): assert dir(MyEnum) == ["__class__", "__doc__", "__members__", "__module__", "apple", "orange"] else: expected_dir = [ "__abs__", "__add__", "__and__", "__bool__", "__ceil__", "__class__", "__contains__", "__delattr__", "__dir__", "__divmod__", "__doc__", "__eq__", "__float__", "__floor__", "__floordiv__", "__format__", "__ge__", "__getattribute__", "__getitem__", "__getnewargs__", "__getstate__", "__gt__", "__hash__", "__index__", "__init__", "__init_subclass__", "__int__", "__invert__", "__iter__", "__le__", "__len__", "__lshift__", "__lt__", "__members__", "__mod__", "__module__", "__mul__", "__name__", "__ne__", "__neg__", "__new__", "__or__", "__pos__", "__pow__", "__qualname__", "__radd__", "__rand__", "__rdivmod__", "__reduce__", "__reduce_ex__", "__repr__", "__rfloordiv__", "__rlshift__", "__rmod__", "__rmul__", "__ror__", "__round__", "__rpow__", "__rrshift__", "__rshift__", "__rsub__", "__rtruediv__", "__rxor__", "__setattr__", "__sizeof__", "__str__", "__sub__", "__subclasshook__", "__truediv__", "__trunc__", "__xor__", "apple", "as_integer_ratio", "bit_count", "bit_length", "conjugate", "denominator", "from_bytes", "imag", "numerator", "orange", "real", "to_bytes", ] if sys.version_info > (3, 12): expected_dir.insert(79, "is_integer") assert dir(MyEnum) == expected_dir def test_auto_number_enum(): class MyEnum(AutoNumberEnum): apple = 1 orange = 1 assert MyEnum.apple._value_ == 1 assert MyEnum.orange._value_ == 2 def test_ordered_enum(): class MyEnum(OrderedEnum): apple = 1 orange = 2 strawberry = 0 assert MyEnum.apple < MyEnum.orange assert MyEnum.apple <= MyEnum.orange assert MyEnum.apple > MyEnum.strawberry assert MyEnum.apple >= MyEnum.strawberry class MyEnum2(Enum): apple = 1 orange = 2 with pytest.raises(TypeError, match="'<' not supported between instances of 'MyEnum2' and 'MyEnum2'"): MyEnum2.apple < MyEnum2.orange # type: ignore[operator] # pylint: disable=pointless-statement enum_tools-0.12.0/tests/test_utils.py000066400000000000000000000037131460302440600176740ustar00rootroot00000000000000# stdlib import enum import http # 3rd party import pytest # this package from enum_tools import StrEnum from enum_tools.utils import get_base_object, is_enum, is_enum_member, is_flag @pytest.mark.parametrize( "obj, result", [ (enum.Enum, True), (http.HTTPStatus, True), (http.HTTPStatus.NOT_ACCEPTABLE, False), (123, False), ("abc", False), ] ) def test_is_enum(obj: object, result: bool): assert is_enum(obj) == result # type: ignore[arg-type] @pytest.mark.parametrize( "obj, result", [ (enum.Enum, False), (http.HTTPStatus, False), (http.HTTPStatus.NOT_ACCEPTABLE, True), (123, False), ("abc", False), ] ) def test_is_enum_member(obj: object, result: bool): assert is_enum_member(obj) == result # type: ignore[arg-type] class Colours(enum.Flag): RED = 1 BLUE = 2 PURPLE = Colours.RED | Colours.BLUE @pytest.mark.parametrize( "obj, result", [ (enum.Enum, False), (http.HTTPStatus, False), (http.HTTPStatus.NOT_ACCEPTABLE, False), (123, False), ("abc", False), (Colours, True), (Colours.RED, False), (PURPLE, False), ] ) def test_is_flag(obj: object, result: bool): assert is_flag(obj) == result # type: ignore[arg-type] def test_get_base_object(): # TODO: report issue to mypy assert get_base_object(enum.Enum) is object # type: ignore[arg-type] assert get_base_object(Colours) is object # type: ignore[arg-type] assert get_base_object(enum.IntFlag) is int # type: ignore[arg-type] assert get_base_object(StrEnum) is str # type: ignore[arg-type] with pytest.raises(TypeError, match="not an Enum"): get_base_object("abc") # type: ignore[arg-type] with pytest.raises(TypeError, match="not an Enum"): get_base_object(123) # type: ignore[arg-type] with pytest.raises(TypeError, match="not an Enum"): get_base_object(str) # type: ignore[arg-type] with pytest.raises(TypeError, match="not an Enum"): get_base_object(int) # type: ignore[arg-type] enum_tools-0.12.0/tokenize_test.py000066400000000000000000000002751460302440600172220ustar00rootroot00000000000000# stdlib import tokenize from io import StringIO from pprint import pprint tokens = tokenize.generate_tokens(StringIO('foo = "abcdefg" # doc: a docstring').readline) pprint(list(tokens)) enum_tools-0.12.0/tox.ini000066400000000000000000000262501460302440600152750ustar00rootroot00000000000000# This file is managed by 'repo_helper'. # You may add new sections, but any changes made to the following sections will be lost: # * tox # * envlists # * testenv # * testenv:.package # * testenv:py313-dev # * testenv:py312-dev # * testenv:py312 # * testenv:docs # * testenv:build # * testenv:lint # * testenv:perflint # * testenv:mypy # * testenv:pyup # * testenv:coverage # * flake8 # * coverage:run # * coverage:report # * check-wheel-contents # * pytest [tox] envlist = py36-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5} py37-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3} py38-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1} py39-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py310-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py311-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py312-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py313-dev-sphinx{6.2,7.0,7.1,7.2} pypy36-sphinx{4.3,4.4,4.5} pypy37-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3} pypy38-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1} pypy39-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} mypy build skip_missing_interpreters = True isolated_build = True requires = pip>=21,!=22.2 tox-envlist>=0.2.1 tox~=3.0 virtualenv!=20.16.0 [envlists] test = py36-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5} py37-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3} py38-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1} py39-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py310-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py311-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py312-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} py313-dev-sphinx{6.2,7.0,7.1,7.2} pypy36-sphinx{4.3,4.4,4.5} pypy37-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3} pypy38-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1} pypy39-sphinx{4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2} qa = mypy, lint cov = py38-sphinx3.4, coverage [testenv] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 SETUPTOOLS_USE_DISTUTILS=stdlib deps = -r{toxinidir}/tests/requirements.txt sphinx3.4: sphinx~=3.4.0 sphinx3.5: sphinx~=3.5.0 sphinx4.0: sphinx~=4.0.0 sphinx4.1: sphinx~=4.1.0 sphinx4.2: sphinx~=4.2.0 sphinx4.3: sphinx~=4.3.0 sphinx4.4: sphinx~=4.4.0 sphinx4.5: sphinx~=4.5.0 sphinx5.0: sphinx~=5.0.0 sphinx5.1: sphinx~=5.1.0 sphinx5.2: sphinx~=5.2.0 sphinx5.3: sphinx~=5.3.0 sphinx6.0: sphinx~=6.0.0 sphinx6.1: sphinx~=6.1.0 sphinx6.2: sphinx~=6.2.0 sphinx7.0: sphinx~=7.0.0 sphinx7.1: sphinx~=7.1.0 sphinx7.2: sphinx~=7.2.0 extras = all commands = python --version python -m pytest --cov=enum_tools -r aR tests/ {posargs} [testenv:.package] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 [testenv:py313-dev] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 [testenv:py312] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 [testenv:docs] setenv = SHOW_TODOS = 1 passenv = SPHINX_BUILDER basepython = python3.8 changedir = {toxinidir}/doc-source extras = all deps = -r{toxinidir}/doc-source/requirements.txt commands = sphinx-build -M {env:SPHINX_BUILDER:html} . ./build {posargs} [testenv:build] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_PREFER_BINARY=1 skip_install = True changedir = {toxinidir} deps = build[virtualenv]>=0.3.1 check-wheel-contents>=0.1.0 twine>=3.2.0 cryptography<40; implementation_name == "pypy" and python_version <= "3.7" commands = python -m build --sdist --wheel "{toxinidir}" twine check dist/*.tar.gz dist/*.whl check-wheel-contents dist/ [testenv:lint] basepython = python3.8 changedir = {toxinidir} ignore_errors = True skip_install = True deps = flake8>=3.8.2,<5 flake8-2020>=1.6.0 flake8-builtins>=1.5.3 flake8-docstrings>=1.5.0 flake8-dunder-all>=0.1.1 flake8-encodings>=0.1.0 flake8-github-actions>=0.1.0 flake8-noqa>=1.1.0,<=1.2.2 flake8-pyi>=20.10.0,<=22.8.0 flake8-pytest-style>=1.3.0,<2 flake8-quotes>=3.3.0 flake8-slots>=0.1.0 flake8-sphinx-links>=0.0.4 flake8-strftime>=0.1.1 flake8-typing-imports>=1.10.0 git+https://github.com/domdfcoding/flake8-rst-docstrings-sphinx.git git+https://github.com/domdfcoding/flake8-rst-docstrings.git git+https://github.com/python-formate/flake8-unused-arguments.git@magic-methods git+https://github.com/python-formate/flake8-missing-annotations.git pydocstyle>=6.0.0 pygments>=2.7.1 importlib_metadata<4.5.0; python_version<'3.8' commands = python3 -m flake8_rst_docstrings_sphinx enum_tools tests --allow-toolbox {posargs} [testenv:perflint] basepython = python3.8 changedir = {toxinidir} ignore_errors = True skip_install = True deps = perflint commands = python3 -m perflint enum_tools {posargs} [testenv:mypy] basepython = python3.8 ignore_errors = True changedir = {toxinidir} extras = all deps = mypy==0.931 -r{toxinidir}/tests/requirements.txt -r{toxinidir}/stubs.txt commands = mypy enum_tools tests {posargs} [testenv:pyup] basepython = python3.8 skip_install = True ignore_errors = True changedir = {toxinidir} deps = pyupgrade-directories extras = all commands = pyup_dirs enum_tools tests --py36-plus --recursive [testenv:coverage] basepython = python3.8 skip_install = True ignore_errors = True whitelist_externals = /bin/bash passenv = COV_PYTHON_VERSION COV_PLATFORM COV_PYTHON_IMPLEMENTATION * changedir = {toxinidir} deps = coverage>=5 coverage_pyver_pragma>=0.2.1 commands = /bin/bash -c "rm -rf htmlcov" coverage html /bin/bash -c "DISPLAY=:0 firefox 'htmlcov/index.html'" [flake8] max-line-length = 120 select = E111 E112 E113 E121 E122 E125 E127 E128 E129 E131 E133 E201 E202 E203 E211 E222 E223 E224 E225 E225 E226 E227 E228 E231 E241 E242 E251 E261 E262 E265 E271 E272 E303 E304 E306 E402 E502 E703 E711 E712 E713 E714 E721 W291 W292 W293 W391 W504 YTT101 YTT102 YTT103 YTT201 YTT202 YTT203 YTT204 YTT301 YTT302 YTT303 STRFTIME001 STRFTIME002 SXL001 PT001 PT002 PT003 PT006 PT007 PT008 PT009 PT010 PT011 PT012 PT013 PT014 PT015 PT016 PT017 PT018 PT019 PT020 PT021 RST201 RST202 RST203 RST204 RST205 RST206 RST207 RST208 RST210 RST211 RST212 RST213 RST214 RST215 RST216 RST217 RST218 RST219 RST299 RST301 RST302 RST303 RST304 RST305 RST306 RST399 RST401 RST499 RST900 RST901 RST902 RST903 Q001 Q002 Q003 A001 A002 TYP001 TYP002 TYP003 TYP004 TYP005 TYP006 ENC001 ENC002 ENC003 ENC004 ENC011 ENC012 ENC021 ENC022 ENC023 ENC024 ENC025 ENC026 Y001,Y002 Y003 Y004 Y005 Y006 Y007 Y008 Y009 Y010 Y011 Y012 Y013 Y014 Y015 Y090 Y091 NQA001 NQA002 NQA003 NQA004 NQA005 NQA102 NQA103 E301 E302 E305 D100 D101 D102 D103 D104 D106 D201 D204 D207 D208 D209 D210 D211 D212 D213 D214 D215 D300 D301 D400 D402 D403 D404 D415 D417 DALL000 SLOT000 SLOT001 SLOT002 extend-exclude = doc-source,old,build,dist,__pkginfo__.py,setup.py,venv rst-directives = TODO automodule autosummary-widths envvar extras-require license license-info rst-roles = choosealicense per-file-ignores = tests/*: D100 D101 D102 D103 D104 D106 D201 D204 D207 D208 D209 D210 D211 D212 D213 D214 D215 D300 D301 D400 D402 D403 D404 D415 D417 DALL000 SLOT000 SLOT001 SLOT002 */*.pyi: E301 E302 E305 D100 D101 D102 D103 D104 D106 D201 D204 D207 D208 D209 D210 D211 D212 D213 D214 D215 D300 D301 D400 D402 D403 D404 D415 D417 DALL000 SLOT000 SLOT001 SLOT002 enum_tools/documentation.py: D300 D301 pytest-parametrize-names-type = csv inline-quotes = " multiline-quotes = """ docstring-quotes = """ count = True min_python_version = 3.6.1 unused-arguments-ignore-abstract-functions = True unused-arguments-ignore-overload-functions = True unused-arguments-ignore-magic-methods = True unused-arguments-ignore-variadic-names = True [coverage:run] plugins = coverage_pyver_pragma [coverage:report] fail_under = 86 show_missing = True exclude_lines = raise AssertionError raise NotImplementedError if 0: if False: if TYPE_CHECKING if typing.TYPE_CHECKING if __name__ == .__main__.: [check-wheel-contents] ignore = W002 toplevel = enum_tools package = enum_tools [pytest] addopts = --color yes --durations 25 timeout = 300 filterwarnings = error ignore:'contextfunction' is renamed to 'pass_context', the old name will be removed in Jinja 3.1.:DeprecationWarning ignore:'environmentfilter' is renamed to 'pass_environment', the old name will be removed in Jinja 3.1.:DeprecationWarning ignore::DeprecationWarning:certifi ignore:can't resolve package from __spec__ or __package__, falling back on __name__ and __path__:ImportWarning ignore:distutils Version classes are deprecated. Use packaging.version instead:DeprecationWarning:sphinx[.*] once:The `docutils.parsers.rst.directive.html` module will be removed in Docutils 1.2.:DeprecationWarning once:nodes.Node.traverse:PendingDeprecationWarning once:nodes.Node.traverse:DeprecationWarning once:The distutils package is deprecated:DeprecationWarning always:module 'sre_(constants|parse)' is deprecated:DeprecationWarning always:'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning:babel[.*] always:builtins.type size changed, may indicate binary incompatibility:RuntimeWarning always:builtins.bool size changed, may indicate binary incompatibility:RuntimeWarning always:'imghdr' is deprecated and slated for removal in Python 3.13:DeprecationWarning:sphinx.util.images always:pkg_resources is deprecated as an API:DeprecationWarning always:Deprecated call to `pkg_resources.declare_namespace:DeprecationWarning always:datetime.utcfromtimestamp\(\) is deprecated and scheduled for removal in a future version:DeprecationWarning:sphinx.builders.gettext always:datetime.datetime.utcfromtimestamp\(\) is deprecated and scheduled for removal in a future version:DeprecationWarning:sphinx.builders.gettext always:The `docutils.parsers.rst.directive.html` module will be removed in Docutils 2.0.:DeprecationWarning always:The frontend.OptionParser class will be replaced by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.:DeprecationWarning always:The frontend.Option class will be removed in Docutils 0.21 or later.:DeprecationWarning always:'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning [testenv:py312-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2}] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 [testenv:py313-dev-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2}] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1 [testenv:py312-dev-sphinx{3.4,3.5,4.0,4.1,4.2,4.3,4.4,4.5,5.0,5.1,5.2,5.3,6.0,6.1,6.2,7.0,7.1,7.2}] setenv = PYTHONDEVMODE=1 PIP_DISABLE_PIP_VERSION_CHECK=1